两种定义正则表达式对象(RegExp)的方法:
1) var pattern = /s$/;
2) var pattern = new RegExp("s$");
系统学习正则表达式的两本参考:
1)Programming Perl by Larry Wall et al. (O'Reilly).
2)Mastering Regular Expressions by Jeffrey E.F. Friedl (O'Reilly)
转义字符(backslash):\
字母和数字不需要转义。其他字符如果记不住就用吧。
这些字符有特殊含义,需要转义:^ $ . * + ? = ! : | \ / ( ) [ ] { }
其它特殊字符表示方法:
\0 NULL(unicode十六进制表示法为\u0000,下同)
\t Tab (\u0009)
\n NewLine (\u000A)
\v Vertical tab (\u000B)
\f Form feed (\u000C)
\r Carriage return (\u000D)
\xnn The Latin character specified by the hexadecimal number nn; for example, \x0A is the same as \n
\uxxxx The Unicode character specified by the hexadecimal number xxxx; for example, \u0009 is the same as \t
\cX The control character ^X; for example, \cJ is equivalent to the newline character \n
一类字符的表示方法:
[...] 括号内的任意一个字符
[^...] 除括号内字符之外的任意一个字符
. 除换行符(or another Unicode line terminator)外的任意一个字符
\w 字母、数字或下划线,等价于[a-zA-Z0-9_]
\W 除字母、数字或下划线外的任意一个字符,等价于[^a-zA-Z0-9_].
\s Unicode whitespace
\S 除Unicode whitespace之外的其他字符。须注意\w和\S是不一样的。
\d 数字,等价于[0-9]
\D 非数字,等价于[^0-9].
[\b] backspace (方括号之间的\b指的是键盘上Backspace键对应的字符).
\b \w和\W之间的位置(锚点),请注意第二个W是大写字母。
重复匹配模式:
{n,m} 匹配至少n次,但是不超过m次
{n,} 匹配n次或n次以上
{n} 匹配恰好n次
? 匹配0次或1次,等价于{0,1}
+ 匹配1次或1次以上,等价于{1,}
* 匹配0次或0次以上,等价于{0,}
举例:
/\d{2,4}/ 2-4个数字
/\w{3}\d?/ 1-3位是个字母、数字或下划线,第四位是一个可选的数字
/\s+java\s+/ 匹配"java"单词,前后都要有空格,1个或多个空格都行
/[^"]*/ 不含双引号的字符串
提醒:使用*和?时要小心。例如/a*/不要求a必须出现,所以"bbb"也会被匹配的。
贪心匹配和不贪心匹配:
之前提到的重复匹配模式会匹配尽可能多的字符,用贪心一词形容很贴切。在重复模式后面跟个问号,则匹配尽可能少的字符。
例如,"aaabbbb"匹配/a*b*/的结果是aaabbbb,匹配/a*b*?/的结果是aaa,匹配/a*?b*/的结果是什么都没有。跟你想的一样么?
选择(alternation)、分组(grouping)和引用(references)
|这个符号从左向右选择第一个可以匹配的模式,例如"aaabbb"匹配/a*|a*b*|b*/的结果是aaa。
()可以构造表达式与|,*,+,?等组合使用。例如/java(script)?/可以匹配"java"或"javascript"(优先)。
()还可以帮助抽取子模式。例如/[a-z]+\d+/可以匹配字母加数字,但是如果你真正关心的是匹配成功后的数字部分,那么,/[a-z]+(\d+)/可以帮到你。
\加一个数字可以引用前面的表达式,无论是否嵌套,总是数左括号的位置。例如/['"][^'"]*['"]/的本意是匹配一对双引号或一对单引号界定的字符串,这个公式还不够严谨。正确的写法是/['"][^'"]*\1/
(?:开头意味着不让引用,例如/([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/这个模式如果有\2,那么引用的就是(fun\w*)了。
提醒:引用提取的是匹配结果(字符串)而不是公式。
锚点(位置匹配):
锚点本质上是对匹配条件的强化。
最基本的锚点就是^和$,表示字符串的开始位置和结束位置。
例如,\s可以表示空格,用它提取单词/\sJava\s/,会连着空格一起提取出来" Java ",如果不需要空格则可以用/\bJava\b/,提取出来的就是"Java"。
\b就是边界的意思。\B表示无边界。例如/\Bscript\b/可以匹配"javascript"提取"script",/\bscript\b/不能,它返回null。
(?=和(?!分别规定字符串为边界。例如/Java(?!Script)/可以匹配"Java is powerful",不能匹配"JavaScript is powerful"。
标记(Flags):
在正则表达式结尾处。i表示不区分大小写。(已验证)
g表示找到全部匹配结果。(有待验证)
m表示多行匹配。(有待验证)
- var mystr = "aaAabbbbbabb";
- var ptn = /a+/ig;
- iJs.pt("mystr");
- iJs.pt("ptn");
- iJs.pt("ptn.exec(mystr)");
- iJs.pt("ptn.test(mystr)");
- iJs.pt("ptn.global");//g标志true or false
- iJs.pt("ptn.ignoreCase");//i标志true or false
- iJs.pt("ptn.multiline");//m标志true or false
- iJs.pt("ptn.lastIndex");//上次匹配结束的位置,初始值为0
- iJs.pt("ptn.source");//正则表达式公式
- iJs.pt("mystr.match(ptn)");//g参数发挥作用的条件比较微妙
mystr aaAabbbbbabb
ptn /a+/ig
ptn.exec(mystr) aaAa
ptn.test(mystr) true
ptn.global true
ptn.ignoreCase true
ptn.multiline false
ptn.lastIndex 10
ptn.source a+
mystr.match(ptn) aaAa,a