1.定义
创建可以用RegEXp()即new RegExp("s"),但更多是通过直接量语法来创建即包含在一对斜杠(/)之间的字符/s/。
正则表达式的模式规则是由一个字符序列组成的,包括所有字母和数字。大多数的字符都是按照直接量仅描述待匹配的字符的。比如/java/可以匹配任何包含“java”字串的字符串。除此外,还有其他具有特殊语义的字符这些字符并不按照字面含义匹配。比如/s$/包含两个字符,第一个“s”按照字面含义匹配,第二个字符$是一个具有特殊语义的元字符,用以匹配字符串的结束。因此这个正则表达式可以匹配任何以“s”结束的字符串。
2.直接量字符
上面说到正则表达式中所有字母和数字都是按照字面含义进行匹配的。如果要匹配非字母的字符,这些字符需要反斜线(\)作为前缀进行转义。
\o NUL字符(\u0000)
\t 制表符(|u0009)
\n 换行符(\u000A)
\v 垂直制表符(\u000B)
\f 换页符(\u000C)
\r 回车符(\u000D)
正则表达式中许多标点符号具有特殊含义它们是:^ $ . * + ? = ! : | \/ () [] {}
3.字符类
将直接量字符放进[]内就组成了字符类,一个字符类可以匹配它所包含的任一字符。“^”符号用来表示非。字符类可以使用连字符来表示字符范围,使用/[a-zA-Z0-9]/匹配任何字母和数字。
由于某些字符类非常常用,因此使用了这些字符的转义字符来表示它们。
[...] 方括号内的任意字符
[^...] 除方括号内的任意字符
. 除换行符合其他Unicode行终止符之外的任意字符
\w 任何ASCII字符组成的单词,等价于[a-zA-Z0-9]
\W 任何不是ASCII字符组成的单词,等价于[^a-zA-Z0-9]
\s 任何Unicode空白符
\S 任何非Unicode空白符的字符
\d 任何ASCII数字等价于[0-9]
\D 除了ASCII数字之外的任何字符,等价于[^0-9]
[\b] 退格直接量(特例)
4.重复
根据正则的语法,可以把两位数描述成/\d\d/,但是还没有一种方法可以用来描述任意多位数字。因此就要用一些特殊字符表示某元素重复出现的次数。
{n,m} 匹配次数大于等于n,小于等于m
{n,} 大于等于n
{n} 等于n
? 匹配0次或者1次,表示可选,等价于{0,1}
+ 匹配1次或多次,等价于{1,}
* 匹配0次或多次,等价于{0,}
上面列出的重复匹配字符是尽可能多地匹配,而且允许后续的正则表达式继续匹配。称之为“贪婪的”匹配。
非贪婪匹配只需要在待匹配的字符后跟随一个问号:“?? ”+?“ “*?”或者“{1,5}?”
将“aaa”作为匹配字符串,/a+/会匹配它的三个字符,/a+?/只能匹配第一个
将“aaab”作为匹配字符串,贪婪和非贪婪匹配是一样的。因为正则表达式总是会寻找字符串中第一个可能匹配的字符串。
5.选择、分组和引用
字符“|”表示或。注意:匹配次序是从左至右,如果左边的匹配就忽略右边,即使右边产生更好的匹配项。例如/a|ab/匹配字符串“ab”时就只匹配第一个字符。
“()”有多种作用。
一个作用是把单独的项组合成子表达式,以便可以处理一个独立单元那样用“|”、“*”等对单元内的项进行处理。
另一个作用是允许在同一正则表达式的后部引用前面的子表达式。通过“\”后加一位或多位数字来实现,这个数字指定了带括号的子表达式在正则中从左至右排第几。
还有一个作用是在完整的模式中定义子模式。当一个正则成功和目标字符串相匹配时,可以从目标串中抽出和圆括号中的子模式相匹配的部分。例如正在检索的模式是一个或多个小写字母后跟了一位或多位数字,可以使用/[a-z]+\d/,但是如果我们关心的是匹配尾部的数字,就可以这样表示(/[a-z]+(\d+)/)。
6.指定匹配位置
一些元素不匹配某个可见的字符,它们只是指定匹配发生的合法位置。有时我们称这些元素为正则表达式的锚。
^ 匹配字符串的开头,在多行检索中,匹配一行的开头
$ 匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b 匹配一个单词的边界
\B 匹配非单词边界的位置
(?=p) 零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配P的那些字符
(?!p) 零宽负先行断言,要求接下来的字符不与p匹配
例如要匹配一种常用的程序设计语言的名字,但只有再其后面出现冒号时才匹配,可以使用/[jJ]ava([sS]cript)?(?=\:)/
7.修饰符
修饰符用以说明高级匹配模式的规则。
i 说明模式匹配不区分大小写
g 说明模式匹配应该是全局,也就是被检索字符串中所有的匹配
m 在多行模式中执行匹配
比如正则/java$/im既可以匹配“java”,也可以匹配“Java\nis fun”。