js正则表达式规则
js正则的语法为:
// '\ \' 符号内包含的是要匹配的内容,例如,如下是匹配abc
var reg = \abc\ ;
字面量字符和元字符
最简单的匹配模式,即字面含义,例如: \abc\ 即匹配字符串abc.
var reg = /cat/;
reg.test('dog and cat'); //true
序号 | 符号 | 匹配 |
---|---|---|
1 | . | 匹配除回车(\r)、换行(\n) 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。注意,对于码点大于0xFFFF字符,点字符不能正确匹配,会认为这是两个字符。 |
2 | ^ | 位置字符:表示字符串的开始位置,例如/^test/会匹配开始位置的字符串 |
3 | $ | 位置字符:表示字符串的结束位置,例如/test$/会匹配结束位置的字符串 |
4 | | | 选择符:正则表达式中表示"或",例如cat |
转义符
如果要匹配一个符号,而不是作为正则表达式的符号,那么将符号前加上: \ , 例如:+ , 匹配 : +
正则表达式中,需要反斜杠转义的,一共有12个字符:^、.、[、$、(、)、|、*、+、?、{和\。需要特别注意的是,如果使用RegExp方法生成正则对象,转义需要使用两个斜杠,因为字符串内部会先转义一次。
(new RegExp('1\+1')).test('1+1')
// false
(new RegExp('1\\+1')).test('1+1')
// true
匹配特殊字符
正则表达式对一些不能打印的特殊字符,提供了表达方法。
- \cX 表示Ctrl-[X],其中的X是A-Z之中任一个英文字母,用来匹配控制字符。
- [\b] 匹配退格键(U+0008),不要与\b混淆。
- \n 匹配换行键。
- \r 匹配回车键。
- \t 匹配制表符 tab(U+0009)。
- \v 匹配垂直制表符(U+000B)。
- \f 匹配换页符(U+000C)。
- \0 匹配null字符(U+0000)。
- \xhh 匹配一个以两位十六进制数(\x00-\xFF)表示的字符。
- \uhhhh 匹配一个以四位十六进制数(\u0000-\uFFFF)表示的 Unicode 字符。
字符类
多个字符中任意匹配一个,使用符号 [] ,例如,[ABC] 匹配A,B,C中的任意一个字符;
[a-z]表示匹配a-z中任意一个字符.
特殊符号
符号 | 功能 |
---|---|
^ | 脱字符:表示非,例如[^xyz],除了字符x,y,z都可以匹配 |
- | 连字符:某些情况下,对于连续序列的字符,连字符(-)用来提供简写形式,表示字符的连续范围。比如,[abc]可以写成[a-c],[0123456789]可以写成[0-9],同理[A-Z]表示26个大写字母。 |
预定义模式
预定义模式是指某些常见模式的简写方式.
- \d 匹配0-9之间的任意数字, 相当于[0-9]
- \D 匹配所有0-9之外的字符,相当于[^0-9]
- \w 匹配任意字母,数字和下划线,相当于[A-Za-z0-9_]
- \W 匹配所有除了字母和数字和下划线以外的字符,相当于[\A-Za-z0-9_]
- \s 匹配空格(换行符,制表符,空格符), 相当于 [\t\r\n\v\f]
- \S 匹配非空格的字符,相当于[^ \t\r\n\v\f]
- \b 匹配词的边界
- \B 匹配非词边界,即在词的内部
重复类
模式的匹配次数用{}
表示, {n}
表示恰好重复n次,{n,}
表示至少重复n次,{n,m}
表示重复n-m次
量词符
量词符,用来设定某个模式出现的次数.
?
={0,1}
*
={0,}
+
={1,}
贪恋模式
匹配的默认模式是贪婪模式, 用一个?
表示非贪恋模式
+?
= 表示某个模式出现1次或多次,使用非贪婪模式*?
= 同理??
= 同理
修饰符
修饰符放在正则的尾部
g
: global,表示全局匹配,匹配全部的符合结果
连续输出三次true,若果我们加上var regex = /b/; var str = 'abcd' regex.test(str); //true regex.test(str); //true regex.test(str); //true
g
修饰符,那么会怎样?
结果只输出了一次true,因为每次开始的位置都是上一次结束的下一个位置,并不从头开始.var regex = /b/g; var str = 'aba'; regex.test(str); // true regex.test(str); // false regex.test(str); // false
i
: ignoreCase,表示忽略大小写 ./abc/.test('ABC') // false /abc/i.test('ABC') // true
m
:multiline, 表示多行模式,默认情况下,^
和$
匹配字符串的开始和结尾处,加上m
后,还会匹配行首和行尾部.即会识别换行符./world$/ .test('hello world\n') // false /world$/m.test('hello world\n') //true /^b/m.test('a\nb') // true
组匹配
概念
正则中的小括号()
表示分组匹配,括号中的模式可以用来匹配分组的内容.
/fred+/.test('fredd') // true
/(fred)+/.test('fredfred') // true
上面代码中,第一个模式没有括号,结果+只表示重复字母d,第二个模式有括号,结果+就表示匹配fred这个词。
var m = 'abcabc'.match(/(.)b(.)/);
m
// ['abc', 'a', 'c']
上面代码中,正则表达式/(.)b(.)/一共使用两个括号,第一个括号捕获a,第二个括号捕获c。
如果使用了g
修饰符,那么就不会捕获分组的内容,即不会单独匹配()
中的内容.
var m = 'abcabc'.match(/(.)b(.)/g);
m // ['abc', 'abc']
如果想要捕获每一轮的组捕获,需要使用exec()
方法
var str = 'abcabc';
var reg = /(.)b(.)/g ;
while(true){
var result = reg.exec(str);
if (!result) break;
console.log(result);
}
// ["abc","a" , "c"]
// ["abc","a" , "c"]
正则表达式的内部,还可以用\n
引用括号匹配的内容,n
是从1开始的自然数,表示对应括号的顺序
'abcabc'.match(/(.)b(.)\1b\2/)
// ["abcabc", "a", "c", index: 0, input: "abcabc", groups: undefined]
非捕获组
(?:x)
: 非捕获组,表示不返回改组匹配的内容,即匹配的结果中不计入这个括号.
非捕获组的作用请考虑这样一个场景,假定需要匹配foo或者foofoo,正则表达式就应该写成/(foo){1, 2}/
,但是这样会占用一个组匹配。这时,就可以使用非捕获组,将正则表达式改为/(?:foo){1, 2}/
,它的作用与前一个正则是一样的,但是不会单独输出括号内部的内容。
var m = 'abc'.match(/(?:.)b(.)/);
m // ["abc", "c"]
// 非捕获组不会出现在匹配的字符串数组中
先行断言
x(?=y)
称为先行断言, x
只有在y
前面才匹配,y
不会计入返回结果. 比如,要匹配后面跟着的百分号数字,可以写成/\d+(?=%)/
先行否定断言
x(?!y)
称为先行否定断言,x
只有不在y
前面才匹配, y
不会被计入匹配结果. 比如,要匹配后面跟的不是百分号的数字,就要写成/\d+(?!%)/
/d+(?!\.)/.exec('3.14')
// ['14']