其实正则表达式核心部分就是:有穷自动机(DFA或NFA),学过编译原理的应该比较清楚。
正则表达式:reg
reg.exec(str); 等同 str.match(reg);,且返回一个数组。
下面是查看一些资料总结(有删减),也用来提示自己:
*表示0次或者多次,等同于{0,}
+表示一次或者多次,等同于{1,}
?表示0次或者1次,等同于{0,1}
1、贪心模式
只要在合法的情况下,它们会尽量多去匹配字符。
例:reg = /c{3,4}/;
2、非贪心模式
如果我们希望正则尽量少地匹配字符,可以在表示数字的符号后面加上一个?。
组成如下的形式:
{n,}?, *?, +?, ??, {m,n}?
注意:贪心、非贪心模式,是在模式匹配之后再做判断的(我的理解)。
3、/^开头,结尾$/
4、点‘.’
‘.’会匹配字符串中除了换行符\n之外的所有字符
5、正则表达式中的或,“|“
例:reg = /^b|c.+/;
6、括号
正则表达式内括号里写的内容会被认为是子正则表达式,所匹配的结果也会被记录下来供后面使用。
例:reg = /^(b|c).+(c|b)/;
不记录子正则表达式的匹配结果
使用形如(?:pattern)的正则就可以避免保存括号内的匹配结果。
例:reg = /^(?:b|c).+/;
正向预查
(1)形式:(?=pattern)
要匹配的字符串,后面必须紧跟着pattern!
例:reg = /cainiao(?=8)/;
需要注意的是,括号里的内容并不参与真正的匹配,只是检查一下后面的字符是否符合要求而已,例如上面的正则,返回的是cainiao,而不是cainiao8。
(2)形式(?!pattern)和?=恰好相反,要求字符串的后面不能紧跟着某个pattern
7、字符集合[abc]
例:reg = /^[a-zA-Z][a-zA-Z0-9_]+/;
8、反字符集合[^abc]
^在正则表达式开始部分的时候表示开头的意思,例如/^c/表示开头是c;
9、边界与非边界
\b表示的边界的意思,也就是说,只有字符串的开头和结尾才算数。例如/\bc/就表示字符串开始的c或者是结尾的c。
与\b对应\B表示非边界。
10、数字与非数字
\d表示数字的意思,相反,\D表示非数字
11、空白
直接量字符:
\f匹配换页符
\n匹配换行符
\r匹配回车
\t匹配制表符(Tab键)
\v匹配垂直制表符。
注意:以上5种字符只需要在字符串中使用一个斜杆,例:str="test\nbbs";
\s匹配单个空格,等同于[\f\n\r\t\v]。
12、单词字符
\w表示单词字符,等同于字符集合[a-zA-Z0-9_]
\W表示非单词字符,等效于[^a-zA-Z0-9_] //不要看少了下划线
13、反向引用 这个挺好用
形式如下:/(子正则表达式)\1/
例1:reg = /(\w)\1/;
例2:reg = /(\w)(\w)\2\1/;
14、匹配元字符
则表达式中都有一定的特殊含义,类似这些有特殊功能的字符都叫做元字符。
例:reg = /c\*/;
15、正则表达式的修饰符
(1)全局匹配,修饰符g(匹配所有的子模式)
如果正则表达式没有设置g,那么exec方法不会对正则表达式有任何的影响,如果设置了g,那么exec执行之后会更新正则表达式的lastIndex属性,表示本次匹配后,所匹配字符串的下一个字符的索引,下一次再用这个正则表达式匹配字符串的时候就会从上次的lastIndex属性开始匹配。
例:var reg = /b/g;
(2)不区分大小写,修饰符i
形式:/pattern/i
(3)行首行尾,修饰符m
形式:/pattern/m
m修饰符的作用是修改^和$在正则表达式中的作用,让它们分别表示行首和行尾。
例:var reg = /^b/m;
匹配到b,因为加了m修饰符之后,^已经表示行首,由于bbs在字符串第二行的行首,所以可以成功地匹配。
对于正则表达式,有很多应用
例:
RegExp方法