正则表达式一些基础知识
duang~开学前留下第一篇笔记~
关于我熟悉又陌生的正则表达式~
一个正则表达式包含一个模式和三个标志(i
、g
、m
)
一、RegExp实例方法
使用:pattern.test(str)
功能:目标字符串中是否包含了与模式匹配的内容test()
- 返回值:
true
/false
;
exec()
- 返回值:包含第一个匹配内容的数组,没有匹配到返回null,为捕获组而设计。
具体见下面七-捕获性分组
二、String实例方法(适用于正则的)
使用:str.match(pattern)
match()
- 功能:获取匹配信息
- 返回值:未设置全局下,返回包含了匹配到第一个字符串的数组;设置全局下,返回包含所有匹配的信息的数组
replace()
- 功能:替换匹配信息
- 返回值:返回替换后的字符串。未设置全局下,匹配到的第一个信息被替换;设置全局下,所有匹配到的信息被替换
search()
- 功能:查找匹配信息
- 返回值:返回第一个匹配的位置,无论是否设置全局;没有匹配到返回-1
4. split()
- 功能:将原字符串按匹配模式分割,也可用来删除、替换
- 返回值:返回包含分割后信息的数组
三、RegExp构造函数属性
使用:RegExp.input
input
leftContent
rightContent
lastMatch
lastParen
multiline
四、RegExp实例属性
使用:regexp.global
global
ignoreCase
lastIndex
注意:
(1)在非全局下,IE与其他浏览器有差别,IE为第二次匹配的位置
(2)非全局下,多次匹配同一字符串均返回第一个匹配位置;全局下,则会继续向下匹配mutiline
source
五、元字符---控制模式匹配的方式
1.重复字符
(1).
---匹配一个字符,除换行符\n外
(2)*
---匹配任意个字符,除换行符外
(3)+
---匹配至少一个字符
(4)?
---匹配0或1个字符
(5){m,n}
---匹配[m,n]
个字符;n
可不写{m}
,或为正无穷{m,}
上述重复字符可以组合使用
2.其他一些字符
[a-z]
、[0-9]
、[a-zA-Z0-9]
(1)^
---非/[^a-z]/
、从头匹配/^[a-z]/
(2)$
---结尾匹配/^[a-z]xx$/
(3)\w
---字母、数字、_
(4)\W
---非字母、非数字、非_
(5)\d
---数字[0,9]
(6)\D
---非数组[^0-9]
(7)\b
---头或结尾匹配/\bxxx{4}\b/
(9)\s
---空格
(9)|
---或
(10)()
---分组
六、贪婪与惰性
1.贪婪:
先看整个字符串是不是一个匹配。
如果没有发现匹配,它去掉最后字符串中的最后一个字符,并再次尝试。
如果还是没有发现匹配,那么再次去掉最后一个字符,这个过程会一直重复直到发现一个匹配或者字符串不剩任何字符。
2.惰性:
先看字符串中的第一个字母是不是一个匹配。
如果单独着一个字符还不够,就读入下一个字符,组成两个字符的字符串。
如果还没有发现匹配,从字符串中添加字符直到发现一个匹配或者整个字符串都检查过也没有匹配。
贪婪量词 | 惰性量词 | 支配量词 | 描述 |
---|---|---|---|
? | ?? | ?+ | 可以出现0次或1次,但至多出现1次 |
* | *? | *+ | 可以出现任意次,也可以不出现 |
+ | +? | ++ | 出现1次或多次,但至少出现1次 |
{n} | {n}? | {n}+ | 一定出现n次 |
{n,m} | {n,m}? | {n,m}+ | 至少出现n次,但至多不能超过m次 |
{n,} | {n,}? | {n,}+ | 可以出现任意次,但至少出现n次 |
七、捕获性分组、非捕获性分组与其他
1. 捕获性分组:所有的分组都捕获返回
var pattern = /(\d+)([a-z])/;
var str = '123abc';
var a = pattern.exec(str);
alert(a);
//123a,123,a
2. 非捕获性分组:在不需要捕获返回的分组前加上?:
var pattern = /(\d+)(?:[a-z])/;
var str = '123abc';
var a = pattern.exec(str);
alert(a);
//123a,123
3. 嵌套分组:从外向内获取
var pattern = /(a?(b?(c?)))/;
var str = 'abc';
var a = pattern.exec(str);
alert(a);
//abc,abc,bc,c
4.前瞻性分组:goo后面必须跟gle才能返回,且返回的是goo
var pattern = /goo(?=gle)/;
var str = 'goobbb';
var a = pattern.exec(str);
alert(a);
//null
八、几个常用的正则
1. 检查邮政编码
//必须是6位数字,第一位不能为0
var pattern = /^[1-9][0-9]{5}$/;
var str = 'This is 644501';
alert(pattern.test(str));
2. 删除多余空格
var pattern = /\s/g;
var str = '111 222 333 555';
alert(str.replace(pattern, ''));
3. 删除首尾空格
方法一:
var pattern = /^\s+/;
var str = ' goo gle ';
var result = str.replace(pattern, '');
pattern = /\s+$/;
result = result.replace(pattern, '');
alert(result);
方法二:
var pattern = /^\s+(.+?)\s+$/; //(.+)是贪婪模式 (.+?)是惰性模式
var str = ' goo gle ';
var result = pattern.exec(str)[1];
alert(result);
方法三:
var pattern = /^\s+(.+?)\s+$/;
var str = ' goo gle ';
var result = str.replace(pattern,'$1');
alert(result);
4. 电子邮件匹配
var pattern = /^\w+([\-\.]\w+)*@\w+([\-\.]\w+)*\.\w+([\-\.]\w+)*$/;
var str = '229541649@qq.com';
alert(pattern.test(str));
5.汉字
/^[\u4e00-\u9fa5]{0,}$/
6.最多只有两位小数的正实数
/^[0-9]+(\.[0-9]{2})?$/
7.非零的正整数
/^[1-9]\d*$/