简介 Introduction
正则表达式(Regular Expression) 是计算机科学的一个概念,正则表达式是使用单个字符串来描述和匹配一系列符合句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索和替换那些符合某个模式的文本。
匹配规则
字面量字符和元字符
在正则表达式中,只表示其自身字符含义的叫做字面量字符。其实,大部分字符都表示字面含义。如:
/a/ #匹配 'a'
/b/ #匹配 'b'
/ab/ #匹配 'ab'
还有一些字符代表特殊含义,而不是其自身意义,叫做元字符,如:
|
字符表示“或”运算,匹配|
字符左边或右边的字符串,|
的数量可推广。
/a|b/ #匹配 'a' 或者 'b'
/a|b|c/ #匹配 'a' 或 'b' 或 'c'
/ab|cd/ #匹配 'ab' 或 'cd' 而不匹配 'a' 或 'b' 或 'c' 或 'd'
.
字符匹配除了回车、换行、行分隔符和段分割符的字符。
/a.b/ #可匹配a,b之间任意字符,如:'acb','a0b'等,但不匹配中间含有多个字符的情况
位置符:
^
字符匹配字符串开始的位置$
字符匹配字符串结束的位置
/^123/ #可匹配'123'出现在开始位置的字符串,如'12345'
/123$/ #可匹配'123'出现在结束位置的字符串,如'0123'
转义字符
如果想要匹配正则表达式中的元字符本身,则需要在它们前面加反斜杠\
,如:
/a\+b/ #匹配 'a+b'
正则表达式中需要反斜杠转义的有:|
,.
,^
,$
,{
,[
,(
,)
,\
,+
,*
特殊字符
正则表达式对一些不能打印的字符提供了特殊的表示方法:
\cX
表示Ctrl-[X]
,其中的X
是A-Z之中任一个英文字母,用来匹配控制字符。[\b]
匹配退格键(U+0008)。\n
匹配换行键。\r
匹配回车键。\t
匹配制表符 tab(U+0009)。\v
匹配垂直制表符(U+000B)。\f
匹配换页符(U+000C)。\0
匹配null
字符(U+0000)
字符类
字符类表示给定一系列字符,只要匹配其中任意一个即可。字符序列被放入方括号[]
中,如:
/[abc]/ #可匹配'app,因为'app'含有字符'a',但不能匹配'def',因为'def'不含'abc'中任意一个
- 如果方括号内的第一个字符是
[^]
,则表示除了字符类之中的字符,其他字符都可以匹配。比如,[^xyz]
表示除了x
、y
、z
之外都可以匹配。
/[^abc]/ #可以匹配'cde',但不能匹配'cba'
- 如果方括号内没有其他字符,只有
[^]
,就表示匹配一切字符,其中包括换行符。相比之下,点号作为元字符(.
)是不包括换行符的 ^
只有在字符类的第一个位置才有特殊含义,否则就是字面含义。- 某些情况下,对于连续序列的字符,连字符(
-
)用来提供简写形式,表示字符的连续范围。比如,[abc]
可以写成[a-c]
,[0123456789]
可以写成[0-9]
,26个大写字母可以写成[A-Z]
。
修饰符
修饰符放在正则表达式的末尾,表示一些附加规则,如:
i
修饰符表示忽略大小写
/abc/i #可匹配 'abc' 或 'ABC'
m
修饰符表示会破坏^
和$
的匹配规则
/name$/ #不能匹配'my name\n'因为结尾不是name,而是换行符
/name$/m #可以匹配'my name\n'
g
修饰符表示全局匹配。默认情况下,正则表达式第一次匹配成功就停止了,而g修饰符可以匹配到末尾
/aaaaa/ #只匹配第一个'a'
/aaaaa/g #匹配所有的'a'
数量符
数量符用来表示某个模式的出现次数。
?
问号表示某个模式出现0次或1次。*
星号表示某个模式出现0次或多次。+
加号表示某个模式出现1次或多次。
/n?ame/ #可匹配'name','ame'
/n*ame/ #可匹配'name','ame','nname'
/n+ame/ #可匹配'name','nname'
数量符默认为贪婪匹配,在数量符后加?
可以将其变为非贪婪匹配:
+?
:表示某个模式出现1次或多次,匹配时采用非贪婪模式。*?
:表示某个模式出现0次或多次,匹配时采用非贪婪模式。??
:表格某个模式出现0次或1次,匹配时采用非贪婪模式
贪婪匹配指匹配到下一个字符不满足要求为止,而非贪婪匹配则只匹配到第一个满足要求的字符。
重复
表示模式的精确匹配次数,使用大括号{}
表示。{n}
表示恰好重复n
次,{n,}
表示至少重复n
次,{n,m}
表示重复不少于n
次,不多于m
次。
/a{2}b/ #可匹配'aab'
/a{2,}b/ #可匹配'aab','aaab'
/a{2,4}b/ #匹配'aaab'
预定义
预定义模式指的是某些常见模式的简写方式。
\d
匹配0-9之间的任一数字,相当于[0-9]
。\D
匹配所有0-9以外的字符,相当于[^0-9]
。\w
匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_]
。\W
除所有字母、数字和下划线以外的字符,相当于[^A-Za-z0-9_]
。\s
匹配空格(包括换行符、制表符、空格符等),相等于[ \t\r\n\v\f]
。\S
匹配非空格的字符,相当于[^ \t\r\n\v\f]
。\b
匹配词的边界。\B
匹配非词边界,即在词的内部。