正则表达式(RegExp)
- 转载源:正则表达式30分钟入门
- 版本:v2.3.5 (2017-6-12) 作者:deerchao
- 此处截取一些简单(需要应用)的内容
- 对于部分代码进行了高亮和格式化处理
- 对于部分代码和介绍进行了修改、增加和删除
关于正则表达式
- Regular Expression,在代码中常简写为regex、regexp或RE,通常被用来检索、替换那些符合某个模式(规则)的文本。
- 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
- 很可能你使用过Windows/Dos下用于文件查找的通配符(wildcard),也就是
*
和?
。如果你想查找某个目录下的所有的Word文档的话,你会搜索*.doc
。在这里,*
会被解释成任意的字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求——当然,代价就是更复杂——比如你可以编写一个正则表达式,用来查找所有以0开头,后面跟着2-3个数字,然后是一个连字号“-
”,最后是7或8位数字的字符串(像010-12345678或0376-7654321)。
测试正则表达式
-
如果你不觉得正则表达式很难读写的话,要么你是一个天才,要么,你不是地球人。正则表达式的语法很令人头疼,即使对经常使用它的人来说也是如此。由于难于读写,容易出错,所以找一种工具对正则表达式进行测试是很有必要的。
-
一些可用的测试工具,当然你也可以百度随便找一个,这些基本源码都是一样的,
只要你没找到个病毒网站上去
元字符
代码 | 说明 |
---|---|
. |
匹配除换行符以外的任意字符 |
\w |
匹配字母或数字或下划线或汉字 |
\s |
匹配任意的空白符 |
\d |
匹配数字 |
\b |
匹配单词的开始或结束 |
^ |
匹配字符串的开始 |
$ |
匹配字符串的结束 |
- 下面来看看更多的例子:
\ba\w*\b
匹配以字母a开头的单词——先是某个单词开始处(\b
),然后是字母a
,然后是任意数量的字母或数字(\w*
),最后是单词结束处(\b
)。- 好吧,现在我们说说正则表达式里的单词是什么意思吧:就是不少于一个的连续的
\w
。不错,这与学习英文时要背的成千上万个同名的东西的确关系不大 :) - 对于
^
和$
匹配字符串开头结尾也是非常常用的,比如:^foo$
匹配字符串foo
^foo
可以匹配字符串foolish
(当然也可以更长或是其他)foo$
可以匹配字符串nofoo
(当然也可以是其他)
重复
代码/语法 | 说明 |
---|---|
* |
重复零次或更多次 |
+ |
重复一次或更多次 |
? |
重复零次或一次 |
{n} |
重复n次 |
{n,} |
重复n次或更多次 |
{n,m} |
重复n到m次 |
- 下面是一些使用重复的例子:
Windows\d+
匹配Windows
后面跟1个或更多数字^\w+
匹配整个字符串的第一个单词的第一个单词\d+
匹配1个或更多连续的数字。这里的+
是和*
类似的元字符,不同的是*
匹配重复任意次(可能是0次),而+
则匹配重复1次或更多次。\b\w{6}\b
匹配刚好6个字符的单词。- 元字符
^
(和数字6在同一个键位上的符号)和$
都匹配一个位置,这和\b
有点类似。^
匹配你要用来查找的字符串的开头,$
匹配结尾。这两个代码在验证输入的内容时非常有用,比如一个网站如果要求你填写的QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$
。 - 这里的
{5,12}
和前面介绍过的{2}
是类似的,只不过{2}
匹配只能不多不少重复2次,{5,12}
则是重复的次数不能少于5次,不能多于12次,否则都不匹配。 - 因为使用了
^
和$
,所以输入的整个字符串都要用来和\d{5,12}
来匹配,也就是说整个输入必须是5到12个数字,因此如果输入的QQ号能匹配这个正则表达式的话,那就符合要求了。
字符转义
- 如果你想查找元字符本身的话,比如你查找
.
,或者*
,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\
来取消这些字符的特殊意义。因此,你应该使用\.
和\*
。当然,要查找\
本身,你也得用\\
。 - 例如:
deerchao\.net
匹配deerchao.net
,C:\\Windows
匹配C:\Windows
。
匹配特定字符
- 要想查找数字,字母或数字,空白是很简单的,因为已经有了对应这些字符集合的元字符,但是如果你想匹配没有预定义元字符的字符集合(比如元音字母
a
,e
,i
,o
,u
),应该怎么办? - 很简单,你只需要在方括号里列出它们就行了,像
[aeiou]
就匹配任何一个英文元音字母,[.?!]
匹配标点符号(.
或?
或!
)。 - 我们也可以轻松地指定一个字符范围,像
[0-9]
代表的含意与\d
就是完全一致的:一位数字;同理[a-z0-9A-Z_]
也完全等同于\w
(如果只考虑英文的话)。 - 下面是一个更复杂的表达式:
\(?0\d{2}[) -]?\d{8}
。 - “
(
”和“)
”也是元字符,后面的分组节里会提到,所以在这里需要使用转义。 - 这个表达式可以匹配几种格式的电话号码,像
(010)88886666
,或022-22334455
,或02912345678
等。我们对它进行一些分析吧:首先是一个转义字符\(
,它能出现0次或1次(?
),然后是一个0
,后面跟着2个数字(\d{2}
),然后是)
或-
或空格
中的一个,它出现1次或不出现(?
),最后是8个数字(\d{8}
)。
分枝条件
- 不幸的是,刚才那个表达式也能匹配
010)12345678
或(022-87654321
这样的“不正确”的格式。要解决这个问题,我们需要用到分枝条件。正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。听不明白?没关系,看例子: 0\d{2}-\d{8}|0\d{3}-\d{7}
这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678
),一种是4位区号,7位本地号(0376-2233445
)。\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}
这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。你可以试试用分枝条件把这个表达式扩展成也支持4位区号的。\d{5}-\d{4}|\d{5}
这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题:使用分枝条件时,要注意各个条件的顺序。如果你把它改成\d{5}|\d{5}-\d{4}
的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
分组(子表达式)
- 我们已经提到了怎么重复单个字符(直接在字符后面加上限定符就行了);但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作(后面会有介绍)。
(\d{1,3}\.){3}\d{1,3}
是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}
匹配1到3位的数字,(\d{1,3}\.){3}
匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3}
)。- 不幸的是,它也将匹配
256.300.888.999
这种不可能存在的IP地址。如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
。 - 理解这个表达式的关键是理解
2[0-4]\d|25[0-5]|[01]?\d\d?
,这里我就不细说了,你自己应该能分析得出来它的意义。 - IP地址中每个数字都不能大于255.
01.02.03.04
这样前面带有0的数字, 是不是正确的IP地址呢? 答案是: 是的, IP 地址里的数字可以包含有前导0
(leading zeroes).
反义
- 有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义:
代码/语法 | 说明 |
---|---|
\W |
匹配任意不是字母,数字,下划线,汉字的字符 |
\S |
匹配任意不是空白符的字符 |
\D |
匹配任意非数字的字符 |
\B |
匹配不是单词开头或结束的位置 |
[^x] |
匹配除了x以外的任意字符 |
[^aeiou] |
匹配除了aeiou这几个字母以外的任意字符 |
- 例子:
\S+
匹配不包含空白符的字符串。 <a[^>]+>
匹配用尖括号括起来的以a
开头的字符串。
注释
- 小括号的另一种用途是通过语法
(?#comment)
来包含注释。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)
。 - 要包含注释的话,最好是启用“忽略模式里的空白符”选项,这样在编写表达式时能任意的添加空格,Tab,换行,而实际使用时这些都将被忽略。启用这个选项后,在
#
后面到这一行结束的所有文本都将被当成注释忽略掉。例如,我们可以前面的一个表达式写成这样:
(?<= # 断言要匹配的文本的前缀 <(\w+)> # 查找尖括号括起来的字母或数字(即HTML/XML标签) ) # 前缀结束 .* # 匹配任意文本 (?= # 断言要匹配的文本的后缀 <|\1> # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签 ) # 后缀结束
贪婪与懒惰
- 当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:
a.*b
,它将会匹配最长的以a
开始,以b
结束的字符串。如果用它来搜索aabab
的话,它会匹配整个字符串aabab
。这被称为贪婪匹配。 - 有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号
?
。这样.*?
就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧: a.*?b
匹配最短的,以a
开始,以b
结束的字符串。如果把它应用于aabab
的话,它会匹配aab
(第一到第三个字符)和ab
(第四到第五个字符)。- 为什么第一个匹配是
aab
(第一到第三个字符)而不是ab
(第二到第三个字符)?简单地说,因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权——The match that begins earliest wins。
代码/语法 | 说明 |
---|---|
*? |
重复任意次,但尽可能少重复 |
+? |
重复1次或更多次,但尽可能少重复 |
?? |
重复0次或1次,但尽可能少重复 |
{n,m}? |
重复n到m次,但尽可能少重复 |
{n,}? |
重复n次以上,但尽可能少重复 |
后向引用
- 使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为
1
,第二个为2
,以此类推。 - 后向引用用于重复搜索前面某个分组匹配的文本。例如,
\
1代表分组1
匹配的文本。难以理解?请看示例: \b(\w+)\b\s+\1\b
可以用来匹配重复的单词,像go go
, 或者kitty kitty
。这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b
),这个单词会被捕获到编号为1
的分组中,然后是1个或几个空白符(\s+
),最后是分组1中
捕获的内容(也就是前面匹配的那个单词)(\1
)。- 你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:
(?<Word>\w+)
(或者把尖括号换成'也行:(?'Word'\w+)
),这样就把\w+
的组名指定为Word
了。要反向引用这个分组捕获的内容,你可以使用\k<Word>
,所以上一个例子也可以写成这样:\b(?<Word>\w+)\b\s+\k<Word>\b
。 - 使用小括号的时候,还有很多特定用途的语法。下面列出了最常用的一些:
分类 | 代码/语法 | 说明 |
---|---|---|
捕获 | (exp) |
匹配exp,并捕获文本到自动命名的组里 |
(?<name>exp) |
匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) | |
(?:exp) |
匹配exp,不捕获匹配的文本,也不给此分组分配组号 | |
零宽断言 | (?=exp) |
匹配exp前面的位置 |
(?<=exp) |
匹配exp后面的位置 | |
(?!exp) |
匹配后面跟的不是exp的位置 | |
(?<!exp) |
匹配前面不是exp的位置 | |
注释 | (?#comment) |
这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 |
- 呃……其实,组号分配还不像我刚说得那么简单:
- 分组0对应整个正则表达式
- 实际上组号分配过程是要从左向右扫描两遍的:第一遍只给未命名组分配,第二遍只给命名组分配--因此所有命名组的组号都大于未命名的组号
- 你可以使用
(?:exp)
这样的语法来剥夺一个分组对组号分配的参与权. - 我们已经讨论了前两种语法。第三个
(?:exp)
不会改变正则表达式的处理方式,只是这样的组匹配的内容不会像前两种那样被捕获到某个组里面,也不会拥有组号。“我为什么会想要这样做?”——好问题,你觉得为什么呢?
零宽断言
- 地球人,是不是觉得这些术语名称太复杂,太难记了?我也有同感。知道有这么一种东西就行了,它叫什么,随它去吧!人若无名,便可专心练剑;物若无名,便可随意取舍……
- 断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。
- 接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像
\b
,^
,$
那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。最好还是拿例子来说明吧: (?=exp)
也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b)
,匹配以ing
结尾的单词的前面部分(除了ing
以外的部分),如查找I'm singing while you're dancing.
时,它会匹配sing
和danc
。(?<=exp)
也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b
会匹配以re
开头的单词的后半部分(除了re
以外的部分),例如在查找reading a book
时,它匹配ading
。- 假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:
((?<=\d)\d{3})+\b
,用它对1234567890
进行查找时结果是234567890
。 - 下面这个例子同时使用了这两种断言:
(?<=\s)\d+(?=\s)
匹配以空白符间隔的数字(再次强调,不包括这些空白符)。
负向零宽断言
- 前面我们提到过怎么查找不是某个字符或不在某个字符类里的字符的方法(反义)。但是如果我们只是想要确保某个字符没有出现,但并不想去匹配它时怎么办?例如,如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样:
\b\w*q[^u]\w*\b
匹配包含后面不是字母u的字母q的单词。但是如果多做测试(或者你思维足够敏锐,直接就观察出来了),你会发现,如果q
出现在单词的结尾的话,像Iraq
,Benq
,这个表达式就会出错。这是因为[^u]
总要匹配一个字符,所以如果q
是单词的最后一个字符的话,后面的[^u]
将会匹配q
后面的单词分隔符(可能是空格,或者是句号或其它的什么),后面的\w*\b
将会匹配下一个单词,于是\b\w*q[^u]\w*\b
就能匹配整个Iraq fighting
。负向零宽断言能解决这样的问题,因为它只匹配一个位置,并不消费任何字符。现在,我们可以这样来解决这个问题:\b\w*q(?!u)\w*\b
。- 零宽度负预测先行断言
(?!exp)
,断言此位置的后面不能匹配表达式exp。 - 例如:
\d{3}(?!\d)
匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b
匹配不包含连续字符串abc
的单词。 - 同理,我们可以用
(?<!exp)
,零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp:(?<![a-z])\d{7}
匹配前面不是小写字母的七位数字。 - 请详细分析表达式
(?<=<(\w+)>).*(?=<|\1>)
,这个表达式最能表现零宽断言的真正用途。- 一个更复杂的例子:
(?<=<(\w+)>).*(?=<|\1>)
匹配不包含属性的简单HTML标签内里的内容。(?<=<(\w+)>)
指定了这样的前缀:被尖括号括起来的单词(比如可能是<b>
),然后是.*
(任意的字符串),最后是一个后缀(?=<|\1>)
。注意后缀里的|
,它用到了前面提过的字符转义;\1
则是一个反向引用,引用的正是捕获的第一组,前面的(\w+)
匹配的内容,这样如果前缀实际上是<b>
的话,后缀就是</b>
了。整个表达式匹配的是<b>
和</b>
之间的内容(再次提醒,不包括前缀和后缀本身)。
- 一个更复杂的例子:
联系作者
- 好吧,我承认,我骗了你,读到这里你肯定花了不止30分钟.相信我,这是我的错,而不是因为你太笨.我之所以说"30分钟",是为了让你有信心,有耐心继续下去.既然你看到了这里,那证明我的阴谋成功了.被忽悠的感觉很爽吧?
- 要投诉我,或者觉得我其实可以忽悠得更高明,欢迎来我的微博让我知道. 如果你有关于正则表达式的问题, 可以到 stackoverflow 网站上提问, 记得要添加
regex
标签. 如果你更习惯于用中文交流, 可以到微博上用#正则#
标签提出问题.
常用正则表达式
说明:正则表达式通常用于两种任务:1.验证,2.搜索/替换。用于验证时,通常需要在前后分别加上^
和$
,以匹配整个待验证字符串;搜索/替换时是否加上此限定则根据搜索的要求而定,此外,也有可能要在前后加上\b
而不是^
和$
。此表所列的常用正则表达式,除个别外均未在前后加上任何限定,请根据需要,自行处理。
说明 | 正则表达式 |
---|---|
网址(URL) | [a-zA-z]+://[^\s]* |
IP地址(IP Address) | ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) |
电子邮件(Email) | \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* |
QQ号码 | [1-9]\d{4,} |
HTML标记(包含内容或自闭合) | <(.*)(.*)>.*<\/\1>|<(.*) \/> |
密码(由数字/大写字母/小写字母/标点符号组成,四种都必有,8位以上) | (?=^.{8,}$)(?=.*\d)(?=.*\W+)(?=.*[A-Z])(?=.*[a-z])(?!.*\n).*$ |
日期(年-月-日) | (\d{4}|\d{2})-((1[0-2])|(0?[1-9]))-(([12][0-9])|(3[01])|(0?[1-9])) |
日期(月/日/年) | ((1[0-2])|(0?[1-9]))/(([12][0-9])|(3[01])|(0?[1-9]))/(\d{4}|\d{2}) |
时间(小时:分钟, 24小时制) | ((1|0?)[0-9]|2[0-3]):([0-5][0-9]) |
汉字(字符) | [\u4e00-\u9fa5] |
中文及全角标点符号(字符) | [\u3000-\u301e\ufe10-\ufe19\ufe30-\ufe44\ufe50-\ufe6b\uff01-\uffee] |
中国大陆固定电话号码 | (\d{4}-|\d{3}-)?(\d{8}|\d{7}) |
中国大陆手机号码 | 1\d{10} |
中国大陆邮政编码 | [1-9]\d{5} |
中国大陆身份证号(15位或18位) | \d{15}(\d\d[0-9xX])? |
非负整数(正整数或零) | \d+ |
正整数 | [0-9]*[1-9][0-9]* |
负整数 | -[0-9]*[1-9][0-9]* |
整数 | -?\d+ |
小数 | (-?\d+)(\.\d+)? |
不包含abc的单词 | \b((?!abc)\w)+\b |
速查表(缩减版)
元字符 | 描述 |
---|---|
\ |
将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\\n ”匹配\n 。“\n ”匹配换行符。序列“\\ ”匹配“\ ”而“\( ”则匹配“( ”。即相当于多种编程语言中都有的“转义字符”的概念。 |
^ |
匹配输入字行首。 |
$ |
匹配输入行尾。 |
* |
匹配前面的子表达式任意次。例如,zo* 能匹配“z ”,也能匹配“zo ”以及“zoo ”。* 等价于{0,} 。 |
+ |
匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+ ”能匹配“zo ”以及“zoo ”,但不能匹配“z ”。+ 等价于{1,} 。 |
? |
匹配前面的子表达式零次或一次。例如,“do(es)? ”可以匹配“do ”或“does ”。? 等价于{0,1} 。 |
{n} |
n 是一个非负整数。匹配确定的n 次。例如,“o{2} ”不能匹配“Bob ”中的“o ”,但是能匹配“food ”中的两个o 。 |
{n,} |
n 是一个非负整数。至少匹配n 次。例如,“o{2,} ”不能匹配“Bob ”中的“o ”,但能匹配“foooood ”中的所有o 。“o{1,} ”等价于“o+ ”。“o{0,} ”则等价于“o* ”。 |
{n,m} |
m 和n 均为非负整数,其中n <=m 。最少匹配n 次且最多匹配m 次。例如,“o{1,3} ”将匹配“fooooood ”中的前三个o 为一组,后三个o 为一组。“o{0,1} ”等价于“o? ”。请注意在逗号和两个数之间不能有空格。 |
? |
当该字符紧跟在任何一个其他限制符(* ,+ ,? ,{n} ,{n,} ,{n,m} )后面时,匹配模式是非贪婪的。非贪婪模式尽可能少地匹配所搜索的字符串,而默认的贪婪模式则尽可能多地匹配所搜索的字符串。例如,对于字符串“oooo ”,“o+ ”将尽可能多地匹配“o ”,得到结果["oooo"] ,而“o+? ”将尽可能少地匹配“o ”,得到结果 ['o', 'o', 'o', 'o'] |
. |
匹配除“\n ”和"\r "之外的任何单个字符。要匹配包括“\n ”和"\r "在内的任何字符,请使用像“[\s\S] ”的模式。 |
(pattern) |
匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到。要匹配圆括号字符,请使用“\( ”或“\) ”。 |
(?:pattern) |
非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|) ”来组合一个模式的各个部分时很有用。例如“industr(?:y|ies) ”就是一个比“industry|industries ”更简略的表达式。 |
(?=pattern) |
非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000) ”能匹配“Windows2000 ”中的“Windows ”,但不能匹配“Windows3.1 ”中的“Windows ”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?!pattern) |
非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000) ”能匹配“Windows3.1 ”中的“Windows ”,但不能匹配“Windows2000 ”中的“Windows ”。 |
(?<=pattern) |
非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows ”能匹配“2000Windows ”中的“Windows ”,但不能匹配“3.1Windows ”中的“Windows ”。 |
(?<!patte_n) |
非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95|98|NT|2000)Windows ”能匹配“3.1Windows ”中的“Windows ”,但不能匹配“2000Windows ”中的“Windows ”。 |
x|y |
匹配x 或y 。例如,“z|food ”能匹配“z ”或“food ”(此处请谨慎)。“[z|f]ood ”则匹配“zood ”或“food ”。 |
[xyz] |
字符集合。匹配所包含的任意一个字符。例如,“[abc] ”可以匹配“plain ”中的“a ”。 |
[^xyz] |
负值字符集合。匹配未包含的任意字符。例如,“[^abc] ”可以匹配“plain ”中的“plin ”任一字符。 |
[a-z] |
字符范围。匹配指定范围内的任意字符。例如,“[a-z] ”可以匹配“a ”到“z ”范围内的任意小写字母字符。注意:只有连字符在字符组内部时,并且出现在两个字符之间时,才能表示字符的范围; 如果出字符组的开头,则只能表示连字符本身. |
[^a-z] |
负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z] ”可以匹配任何不在“a ”到“z ”范围内的任意字符。 |
\b |
匹配一个单词的边界,也就是指单词和空格间的位置(即正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的)。例如,“er\b ”可以匹配“never ”中的“er ”,但不能匹配“verb ”中的“er ”;“\b1_ ”可以匹配“1_23 ”中的“1_ ”,但不能匹配“21_3 ”中的“1_ ”。 |
\B |
匹配非单词边界。“er\B ”能匹配“verb ”中的“er ”,但不能匹配“never ”中的“er ”。 |
\d |
匹配一个数字字符。等价于[0-9] 。 |
\D |
匹配一个非数字字符。等价于[^0-9] 。 |
\n |
匹配一个换行符。等价于\x0a 。 |
\r |
匹配一个回车符。等价于\x0d 。 |
\s |
匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v] 。 |
\S |
匹配任何可见字符。等价于[^ \f\n\r\t\v] 。 |
\t |
匹配一个制表符。等价于\x09 。 |
\v |
匹配一个垂直制表符。等价于\x0b 。 |
\w |
匹配包括下划线的任何单词字符。类似但不等价于“[A-Za-z0-9_] ”,这里的"单词"字符使用Unicode字符集。 |
\W |
匹配任何非单词字符。等价于“[^A-Za-z0-9_] ”。 |
\xn |
匹配n ,其中n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41 ”匹配“A ”。“\x041 ”则等价于“\x04&1 ”。正则表达式中可以使用ASCII编码。 |
\num |
匹配num ,其中num 是一个正整数。对所获取的匹配的引用。例如,“(.)\1 ”匹配两个连续的相同字符。 |
\un |
匹配n ,其中n 是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9 匹配版权符号(©)。 |
( ) |
将( 和 ) 之间的表达式定义为“组”(group ),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。 |
| |
将两个匹配条件进行逻辑“或 ”(Or )运算。例如正则表达式(him|her) 匹配"it belongs to him "和"it belongs to her ",但是不能匹配"it belongs to them. "。 |