1、方括号
方括号用于查找某个范围内的字符:
表达式 描述
[abc] 查找方括号之间的任意一个字符,不是多个。
[^abc] 查找任何不在方括号之间的任意一个字符,不是多个。
[0-9] 查找任何从 0 至 9 的任意一个数字。
[a-z] 查找任何从小写 a 到小写 z 的任意一个字符。
[A-Z] 查找任何从大写 A 到大写 Z 的任意一个字符。
[A-z] 查找任何从大写 A 到小写 z 的任意一个字符。
[adgk] 查找给定集合内的任意一个字符。
[^adgk] 查找给定集合外的任意一个字符。
(red|blue|green) 查找任何指定的选项。
2、元字符及转义字符
元字符(Metacharacter)是拥有特殊含义的字符,
所有元字符包括:([{\^$|?*.+}]),如果想单纯的使用本意,需使用反斜杠转义,
例如使用$的本意而不是匹配结尾,需要\$,如果匹配模式是字符串,需要用双反斜杠才能起作用,
如果想使用特殊含义,则直接$,不用反斜杠
元字符 描述
. 匹配单个任意字符,除了换行和行结束符。
| 左右两边表达式之间 "或" 关系,匹配左边或者右边。
例如:表达式 "Tom|Jack" 在匹配字符串 "I'm Tom, he is Jack" 时,
匹配结果是:成功;匹配到的内容是:"Tom";
匹配下一个时,匹配结果是:成功;匹配到的内容是:"Jack"
() 用于定义捕获组,可以单独拿到捕获组匹配项,捕获组内的匹配模式也可以被整体修饰。
例如: 表达式 "(go\s*){3}" 在匹配 "Let's go go go!" 时,
匹配结果是:成功;匹配到内容是:"go go go"。
通过正则对象RegExp的构造函数属性取出捕获组匹配项:alert(RegExp.$1)//go
表达式 "(¥)(\d+\.?\d*)" 在匹配 "$10.9,¥20.5" 时,
匹配的结果是:成功;匹配到的内容是:"¥20.5"。
通过正则对象RegExp的构造函数属性取出捕获组匹配项:alert(RegExp.$1)//¥,alert(RegExp.$2)//20.5
[] 匹配任意包含在[]内的一系列字符中的任意一个,不是多个。
例如:[f-k]匹配 "f"到"k" 之间的任意一个字母,
[ab4#]匹配 "a" 或 "b" 或 "4" 或 "#"的任意一个字符
[^] 匹配任意不包含在[]内的一系列字符中的任意一个,不是多个。
例如:[^abc]匹配 "a","b","c" 之外的任意一个字符,
[^A-F0-3]匹配 "A"到"F","0"到"3" 之外的任意一个字符
n$ 匹配任何结尾为 n 的字符串。
^n 匹配任何开头为 n 的字符串。
?=n 匹配任何其后紧接指定字符串 n 的字符串。
?!n 匹配任何其后没有紧接指定字符串 n 的字符串。
(?:n) 表示不输出捕获组信息。
转义字符:
\w 查找单词字符。
\W 查找非单词字符。
\d 查找数字。
\D 查找非数字字符。
\s 查找空白字符。
\S 查找非空白字符。
\b 匹配单词边界。
例如:表达式 "\bend\b" 表示匹配end前后的边界,即end前后没有单词,
在匹配 "weekend,endfor,end" 时,匹配结果是:成功;匹配到的内容是:"end";
匹配到的位置是:开始于15,结束于18。
位置4的e前面有k是单词,位置10的d后面有f是单词
\B 匹配非单词边界。
\0 查找 NUL 字符。
\n 查找换行符。
\f 查找换页符。
\r 查找回车符。
\t 查找制表符。
\v 查找垂直制表符。
\xxx 查找以八进制数 xxx 规定的字符。
\xdd 查找以十六进制数 dd 规定的字符。
\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。
3、量词,修饰匹配次数
量词 描述
n+ 匹配任何包含至少一个 n 的字符串。相当于 {1,},
例如:"a+b"可以匹配 "ab","aab","aaab"...
n* 匹配任何包含零个或多个 n 的字符串。相当于 {0,},
例如:"\^*b"可以匹配 "b","^^^b"...
n? 匹配任何包含零个或一个 n 的字符串。相当于 {0,1},
例如:"a[cd]?"可以匹配 "a","ac","ad","acd"
n{X} 匹配包含 X 个 n 的序列的字符串。
例如:"\w{2}" 相当于 "\w\w","a{5}" 相当于 "aaaaa"
n{X,Y} 匹配包含 X 或 Y 个 n 的序列的字符串。
例如:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"
n{X,} 匹配包含至少 X 个 n 的序列的字符串。
例如:"\w\d{2,}"可以匹配 "a12","_456","M12344"...
4、贪婪模式与非贪婪模式
添加修饰匹配次数的量词,默认为贪婪模式,尽可能多地匹配;
而非贪婪模式,是在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配。
例如:/(d)(\w+)/表示"\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd",尽可能多的匹配,贪婪模式
/(d)(\w+?)/表示"\w+?" 将尽可能少的匹配第一个 "d" 之后的字符,
结果是:"\w+?" 只匹配了一个 "x",尽可能少的匹配,非贪婪模式
5、捕获组与反向引用
捕获组:用元字符()表示,小括号包含的表达式所匹配到的字符串可以通过RegExp的构造函数属性单独获取,
在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的 "<td>(.*?)</td>"。
反向引用:小括号包含的表达式所匹配到的字符串不仅是在匹配结束后才可以使用,
在匹配过程中也可以使用,表达式后边的部分,可以引用前面小括号内的子匹配已经匹配到的字符串。
引用方法是 "/" 加上一个数字。"/1" 引用第1对括号内匹配到的字符串,
"/2" 引用第2对括号内匹配到的字符串……以此类推,
如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 "(" 在前,那这一对就先排序号。
表达式 /('|")(.*?)(\1)/
匹配模式说明:
第一个捕获组表示匹配一个单引号或双引号,
第二个捕获组表示匹配任意一个字符至少0个,问号表示的是采用非贪婪模式,
第三个捕获组表示反向引用第一个捕获组,即匹配一个单引号或双引号
在匹配 "'Hello', \"World\"" 时(需将内部双引号转义),匹配结果是:成功;
匹配到的内容是:'Hello'。再次匹配下一个时,可以匹配到 "World"。
表达式 /(\w)\1{4,}/
匹配模式说明:第一个捕获组表示匹配一个单词字符,然后使用\1反向引用第一个捕获组,同样表示匹配一个单词字符,
又通过后面的数量{4,},约束至少4个,
整个匹配模式就是匹配第一个单词字符+后面4个单词字符,至少5个单词字符,如果存在则成功。
在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 时,匹配结果是:成功;匹配到的内容是 "ccccc"。
表达式 /<(\w+)\s*(\w+(=('|").*?\4)?\s*)*>.*?</\1>/
匹配模式说明:
表达式中有4个捕获组:(\w+)、(\w+(=('|").*?\4)?\s*)、(=('|").*?\4)、('|"),
反向引用使用了两次,第一次反向引用捕获组4,第二次反向引用捕获组1,
整个模式含义: 1、匹配一个左尖括号
2、第一个捕获组,匹配单词字符1到多个
3、匹配空白字符,0到多个
4、进入第二个捕获组,先匹配单词字符1到多个
5、进入第三个捕获组,先匹配一个=号
6、进入第四个捕获组,匹配一个单引号或一个双引号
7、然后第三个捕获组继续匹配,匹配任意字符0到多个,采用非贪婪模式,尽量少匹配
8、然后反向引用第四个捕获组的结果,即执行第6步的结果
9、回到第二个捕获组继续匹配,?表示第三个捕获组匹配的结果个数为0或1个,然后再匹配一个空白字符0到多个
10、而第二个捕获组匹配的结果个数为0到多个
11、然后匹配一个右尖括号,后面是一个任意字符个数为0到多个,采用非贪婪模式,
尽量少匹配,再后面是一个左尖括号和正斜杠
12、正斜杠后面反向引用第一个捕获组的结果,即执行第二步的结果
13、最后是一个右尖括号
在匹配 "<td id='td1' style="bgcolor:white"></td>" 时,匹配结果是成功。
如果 "<td>" 与 "</td>" 不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。
6、普通字符串
参照:http://blog.csdn.net/zaifendou/article/details/5746988
1、方括号 方括号用于查找某个范围内的字符: 表达式 描述 [abc] 查找方括号之间的任意一个字符,不是多个。 [^abc] 查找任何不在方括号之间的任意一个字符,不是多个。 [0-9] 查找任何从 0 至 9 的任意一个数字。 [a-z] 查找任何从小写 a 到小写 z 的任意一个字符。
/^(?=.*\d)(?=.*[a-zA-Z])(?=.*[~!@#$%^&*])[\da-zA-Z~!@#$%^&*]{8,}$/
这里主要用到了js正则表式中的正向前瞻 ?=,举个例子
/\d/.exec( ‘abc2abc’ ) 匹配结果为2,释义:匹配一个数字
/\d(?=a)/.exec( ‘abc2abc’ ) 匹配结果为2,释义:匹配一个数字,但是这个数字后面必须跟着字母a
正则表达式中用"()"括起来的称为分组,例如var patt=/(\w)(\d)/这里就用了分组。有多少组呢?2组。反向引用是按照从左到右遇到的左括号字符的顺序进行编号和创建的。所以是两组。看下面的例子
var str1="1d2a2"
var patt =/(\w)(\d)/
console.log(str1.match(patt))
得到结果为:
["d2", "d",...
1.1 什么是捕获组
捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。当然,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部。
捕获组有两种形式,一种是普通捕获组,另一种是命名捕获组,通常所说的捕获组指的是普通捕获组。语法如下:
普通捕获组:(Expression)
命名捕获组:(?Expression)
普通捕获组在大多数支持...
反向引用语法为“\num”,即可引用编号为num的字匹配存储的内容。num是从1到99的整数,并且num是前面表达式中已编号的子匹配,当然也不能超出已有编号的范围。
例如正则表达式/\w{5}/可以匹配目标字符串中连续出
捕获组的定义:
捕获组简单来说就是把正则表达式中用括号匹配的内容,保存到内存中,方便调用。js中每一个括号匹配的内容可以被RegExp对象捕获到(最多匹配九个,可以通过返回一个数组索引来取得所有的括号匹配项.),存储在RegExp.$1…中。
RegExp.$1 //第一个括号匹配的内容,以次类推
RegExp.$2
RegExp.$3
RegExp.$1…作为RegEx...
const reg = /I have a (apple|watermelon)/;
reg.test('I have a apple') // RegExp.$1 = 'apple'
利用捕获循环处理字符串
比如去掉’[[[aaa]]]'中的中括号(这里只是举个例,可以这样来处理更复杂的模板字符串)
const reg = /\[([a-zA-z]*)\]/;
let str = '[[[aaa]]]';
while(reg.test(str)){
str = str.replace(re