js中的正则

 

 

基础字符表
\b 匹配一个单词边界
\B 匹配一个非单词边界
^  匹配字符串开始位置
 匹配字符串结束位置
 []  匹配任意方括号中任意一个原子
 [^]  匹配除方括号中的原子
 .  匹配除换行符之外的任意字符
\d   匹配一个数字
\D   匹配一个非数字
\w   匹配一个字母,数字或下划线
\W 配一个非字母,数字或下划线
\s 匹配一个不可见原子
\S 匹配一个非不可见原子
{n} 表示前面的原子恰好出现n次
{n,m} 表示前面的原子出现n到m次
{n,} 表示前面的原子最少出现n次
* 即{0,}
+ 即{1,}
? 即{0,1}

 

需要转义的字符(元字符)表
\ ^ $ . | ? * + ( ) [ ] { }

 

正则匹配总是贪婪的,使用?可以关闭贪婪

reg = /a{1,3}/
reg.exec('aaa')  //["aaa", index: 0, input: "aaa"]
reg = /a{1,3}?/ reg.exec('aaa') //["a", index: 0, input: "aaa"]

 

分组和反向引用:

圆括号分组,使用()包裹的表达式被称为一个组。在后面的表达式中可以使用\1来进行反向引用,这个数字是从左到右自动进行编号的,多个嵌套的话也是从里到外进行编号的。

reg = /(a|b)\1/
reg.exec('aa')  //["aa", "a", index: 0, input: "aa"]

需要注意的是,这个\1指代的不是a|b这个正则表达式,而是指代的被a|b匹配的内容,如下

reg = /(a|b)\1/
reg.exec('ab') //null,因为前面的(a|b)匹配的是a,所以\1也是指代的a

在括号中使用?: 如(?:a)就不会被捕获编号

reg = /(?:a|b)(c|d)\1/
reg.exec('acc')    //["acc", "c", index: 0, input: "acc"] 输出的结果中,没有了(?:a|b)中匹配的内容,而且/1也是引用的(c|d)中匹配到的c

我们也可以给分组进行命名,就可以不使用编号来进行反向引用,命名方式为(?<name>a|b) 引用方式为\k<name>

reg = /(?<name>a|b)\k<name>/
reg.exec('aa')  //["aa", "a", index: 0, input: "aa", groups:{name: "a"}] ,匹配的结果相同,只是输出的时候多了一个groups

 

预匹配:

预匹配就是先看后面的是否符合匹配规则,然后再决定前面的是否匹配,比如

reg = /a(?!b)/   //表示匹配后面没有b的a字符串 
reg.exec('ac')  //["a", index: 0, input: "ac"]
reg.exec('ab') //null

同时,匹配的结果也不会包含括号中的内容,比如匹配reg.exec('ac')匹配的就不是ac,而是a

同样的,还有以下几个预匹配

reg = /a(?=b)/    //表示匹配后面有b的a字符串
reg.exec('ab')    //["a", index: 0, input: "ab"]
reg.exec('ac')    //null

reg = /(?<=a)b/     //表示匹配前面有a的b字符串
reg.exec('ab')    //["b", index: 1, input: "ab"]

reg = /(?<!a)b/    //表示匹配前面没有a的b字符串
reg.exec('cb')  //["b", index: 1, input: "cb"]

 

RegExp对象:

可以使用下面两种方式来定义RegExp对象:

reg = /abc/g

reg = new RegExp('abc', 'g')

exec方法的参数是待匹配的字符串,返回值为null或者数组,如果匹配到的话,会返回匹配的文本,如果表达式有分组的话还会返回分组中匹配的部分,还有index属性表示匹配开始的位置,input表示输入的字符串,如果有使用分组命名的话,还会有一个groups属性表示名称

reg = /(?<name>a|b)\k<name>/
reg.exec('aa')  //["aa", "a", index: 0, input: "aa", groups:{name: "a"}] ,匹配的结果相同,只是输出的时候多了一个groups

test方法的参数也是待匹配的字符串,匹配成功返回true,否则为false

reg = /a/
reg.test('b') //false

 

string对象中的正则:

search方法:返回匹配到的起始位置,匹配失败返回-1

'abc'.search(/b/) //1

match方法:同RegExp对象的exec方法

replace方法:第一个参数regexp为要替换的文本,可以为字符串或者正则,第二个参数replacement用来替换匹配的文本,replacement可以为字符串或者函数,如果为字符串的话,将直接进行替换,如果replacement中有$字符的话,将有特殊的含义

$1、$2、...、$99 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。
$& 与 regexp 相匹配的子串。
$` 位于匹配子串左侧的文本。
$' 位于匹配子串右侧的文本。
$$ 直接量符号。

如果replacement为函数的话,那么函数参数和match方法的返回值一致,返回的值就是用来替换匹配的文本。

posted @ 2018-03-29 00:11  这名字就是霸气  阅读(428)  评论(0)    收藏  举报