主要是为了方便查看,此篇博客几乎没有例子
表达式中的 /
用来标示正则表达式的开始和结束
非打印字符
\cx
,匹配由 x 指明的控制字符。例如/cM
匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。\f
,匹配一个换页符,等价于\x0c
和\cL
\n
,匹配一个换行符,等价于\x0a
和\cJ
\r
,匹配一个回车符,等价于\x0d
和\cM
\s
,匹配任何空白字符,包括空格,制表符,换页符等。等价于[\f\n\r\t\v]
\S
,匹配任何非空白字符。等价于[^ \f\n\r\t\v]
\t
,匹配一个制表符。等价于\x09
和'cl'
\v
,匹配一个垂直制表符。等价于\x0b
和\cK
特殊字符 (如果本身需要匹配这个字符,需要转义)
$
,匹配字符串的结尾位置。要匹配字符$
本身,需要使用\$
()
,标记一个子表达式的开始和结束位置*
,匹配前面的子表达式零次或多次+
,匹配前面的子表达式一次或多次.
,匹配除换行符之外的任何单字符[
,表示一个中括号表达式的开始?
,匹配前面的子表达式零次或一次,或指明一个非贪婪限定符\
,讲下一个字符标记为 或特殊字符、或原义字符、或向后引用、或八进制转义符^
,匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合{
,标记限定符表达式的开始|
,指明两项之间的一个选择
限定符
*
,匹配前面的子表达式零次或多次。例如zo*
能匹配zo
,z
等。等价于{0,}
+
,匹配前面的子表达式一次或多次。例如zo+
能匹配zo
,zoo
,但是不能匹配z
,等价于{1,}
?
,匹配前面的字表达式零次或一次。例如do{es}
能匹配do
,does
,等价于{0,1}
{n}
,n 是一个非负整数。匹配前面的子表达式确定 n 次。如o{2}
能够匹配food
中的两个 o,但不能匹配Bob
中的一个 o{n,}
,n 是一个非负整数,匹配前面的子表达式至少 n 次{n,m}
,n 和 m 均为非负整数,其中 n <= m。匹配前面的子表达式至少 n 次,至多 m 次
其中,
*
与+
限定符都是贪婪的,会尽可能匹配多的文字。
定位符
^
,匹配输入字符串开始的位置$
,匹配输入字符串结尾的位置\b
,匹配一个单词边界,即字与空格间的位置,如\bCha
能够匹配Chapter
\B
,非单词边界匹配,如\Bapt
能匹配Chapter
中的 apt,但不能匹配aptitude
中的 apt
!限定符与定位符不能一起使用。
选择
用圆括号将所有选择项括起来,相邻的选择项之间用 |
分隔。但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。
其中 ?:
是非捕获元之一,还有两个非捕获元是 ?=
和 ?!
,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。
反向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 \n
访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
可以使用非捕获元字符 ?:
、?=
或 ?!
来重写捕获,忽略对相关匹配的保存。
如:"Is is the cost of of gasoline going up up"
,想要匹配其中的重复单词,便可以这样书写正则表达式:/\b([a-z]+) \1\b/ig
。
其中,\1
指定第一个子匹配项。\b
保证值匹配单词,能够区分 is issued
或 this is
这样的词组;全局标记 g
指定将该表达式应用到输入字符串中能够查找尽可能多的匹配;i
标记指定不区分大小写
元字符
-
\
,见上 -
^
,见上 -
$
,见上 -
*
,见上 -
+
,见上 -
?
,见上 -
{n}
,见上 -
{n,}
,见上 -
{n,m}
,见上 -
.
,见上 -
(pattern)
,匹配 patter 并获取这一匹配 -
(?:pattern)
,匹配 patter 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用 -
(?=pattern)
,正向肯定预查,在任何匹配 pattern 的字符串开始出匹配查找字符串。这是一个非获取匹配 -
(?!pattern)
,正向否定预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串,这是一个非获取匹配 -
(?<=pattern)
,反向肯定预查,与正向肯定预查类似,只是方向相反。例如,
(?<=95|98|NT|2000)Windows
能匹配2000Windows
中的 Windows,但不能匹配3.1Windows
中的 Windows -
(?<!pattern)
,反向否定预查,与正向否定预查类似,只是方向相反。如,
(?<!95|98|NT|2000)|Windows
能够匹配3.1Windows
中的 Windows,但是不能匹配2000Windows
中的 Windows -
x|y
,匹配 x 或 y -
[xyz]
,字符集合,匹配所包含的任意一个字符 -
[^xyz]
,负值字符集合,匹配未包含的任意字符 -
[a-z]
,字符范围,匹配指定范围内的任意字符 -
[^a-z]
,负值字符范围,匹配任何不在指定范围内的任意字符 -
\b
,见上 -
'B'
,见上 -
\cx
,见上 -
\d
,匹配一个数字字符,等价于[0-9]
-
\D
,匹配一个非数字字符,等价于[^0-9]
-
\f
,见上 -
\n
,见上 -
\r
,见上 -
\s
,见上 -
\S
,见上 -
\t
,见上 -
\v
,见上 -
\w
,匹配字母数字下划线。等价于[A-Za-z0-9_]
-
\W
,匹配非字符数字下划线。等价于[^A-za-z0-9_]
-
\xn
,匹配 n,其中 n 为十六进制转移值,必须为确定的两个数字长 -
\num
,匹配 num,num 是一个正整数。对所获取的匹配的引用。例如,(.)\1
匹配连续两个相同的字符 -
\n
, -
\nm
, -
\nml
, -
\un
,
运算符优先级
(从上至下优先级从高到低),相同优先级从左到右进行运算
\
,转义符()
,(?:)
,(?=)
,[]
*
,+
,?
,{n}
,{n,}
,{n,m}
^
,$
|