平允的英文译语怎么说-日常交际英语口语
2023年4月19日发(作者:初中女生发育)【导读】正则表达式是从左向右去匹配目标字符串的一组模式。大多数字符在模式中表示它们自身并匹配目标中相应的字符
正则表达式广泛出现在UNIX/Linux相关的各种领域和多种编程语言里。从常见的shell命令到大名鼎鼎的Perl语言再到当前非
常流行的PHP,它都扮演着一个重要的角色。甚至windows的命令行控制台也支持正则表达式。如果你是一个Linux服务器管理
员,你经常会在一些服务器的设置脚本里看到它。
可以说,它是学好Linux/UNIX必需掌握的一个知识点,否则你连Linux的启动脚本都读不懂。偏偏它又的确有点晦涩难懂,
而且相关的资料又大部分是英文,更为它的学习增加了几多困难。即使有些中文的翻译资料,不同的译者对一些术语的译法也五
花八门,读着让人平添困惑。为此,我决定为它写一个简明教程,尽量可以覆盖正则表达式涉及到的各主要概念。
我并不想把本文写成一本详细的正则表达式语法手册,事实上,这些手册已经存在了,不过读起来比较难懂。我希望的是在
完成本教程后,你可以比较轻松的读懂各种工具的正则表达式语法手册并可以迅速上手,不过要用好正则表达式,可不是一篇短
短的教程可以解决的,那是无数实践练习的结果。但是,本文的最后一部分对于正则表达式的编写提出了一些原则性的建议,学
习一下这些正则表达式应用先驱者的经验会让我们在今后的实践中少走一些弯路。
正则表达式是英文“regularexpressions”的译文,它的产生据说可以追溯到“神经网络”等比较高深的理论。那么什么是
正则表达式呢?
正则表达式是从左向右去匹配目标字符串的一组模式。大多数字符在模式中表示它们自身并匹配目标中相应的字符。举个最
简单的例子,模式“Thequickbrownfox”匹配了目标字符串中与其完全相同的一部分。
前面已经提过,正则表达式被许多植根于UNIX/Linux的工具采用,可是这些工具的正则表达式语法并不完全相同,它们中的
一些对正则表达式语法的扩展并不被其它工具识别,这也为正则表达式的使用增加了难度。因此,当你在一个具体的环境中使用
正则表达式时,你还要先看一下目标环境支持的语法范围,以确保你的正则表达式被正确的解析。
在本文中列举的例子里,我们用正斜线“/”做为模式的定界符(delimiter),一个模式用下面这种格式表示:
/[A-Z]+(abc|xyz)*/i
本文将较详细的阐明下面这些正则表达式概念:模式修正符(modifier),元字符(Meta-characters),子模式(subpatterns)
与逆向引用(Backreferences),重复(Repetition)和量词(quantifiers),断言(Assertions),注释,正则表达式中的
递归,最后我介绍一款方便学习正则表达式的工具并介绍一些正则表达式编写的思路。
正则表达式的模式修正符(modifier)
正则表达式的模式修正符主要用来限定模式与目标字符串的匹配方式,例如是否需要大小写敏感的匹配,是单行模式还是多
行模式。修正符中的空格和换行被忽略,其它字符会导致错误。下面列举一些常见的模式修正符。注意,模式修正符是区分大小
写的。
i:非大小写敏感模式,:如果设定此修正符,模式中的字符将同时匹配大小写字母。
m:多行模式,当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的
之后和之前。
s:单行模式,如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行
符。
对于多行模式和单行模式,一个容易让初学者迷惑的地方是这两者并不向字面上那样是互斥的。事实上,它们只是分别定义
了英文句点(.)、音调符(^)和美元符($)这三个元字符的匹配方式,因此,单行模式与多行模式的修正符可以同时使用。
x:如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的#以及
下一个换行符之间的所有字符,包括两头,也都被忽略。它使得可以在复杂的模式中加入注释。我们会在后面的部分更详细的讲
解正则表达中的注释。
模式修正符还有很多,这里不再一一列举。我们会结合后面的内容介绍一些其它的模式修正符。不同的工具也可以添加自己
的模式修正符,不过上面几最为常见。
模式修正符通常跟在模式定义结束符的后面,例如下面例子中模式最后的“i”字符。/[A-Z]+(abc|xyz)*/i,这时此修正符
会对整个匹配模式起作用。模式修正符也可以在模式内部通过包含在\"(?\"和\")\"之间的修正符字母序列来实现。例如,(?im)设
定了不区分大小写,多行模式。也可以通过在字母前加上减号来取消这些选项。例如组合的选项(?im-s),设定了不区分大小写
和多行模式,并取消了单行模式。如果一个字母在减号之前与之后都出现了,则该选项被取消设定。
注意,如果(?im-s)出现在一个子模式内(被另一对小括号包含)会把模式修正符的作用局限在该子模式中。
正则表达式的元字符(Meta-characters)
正则表达式的威力在于其能够在模式中包含选择和循环。它们通过使用元字符来编码在模式中,元字符不代表其自身,它们
用一些特殊的方式来解析。
有两组不同的元字符:一种是模式中除了方括号内都能被识别的,还有一种是在方括号内被识别的。如果想在模式里包含一个
元字符本身,就需要用到转义符号,正则表达式常用反斜线“”作为转义字符使用,为了匹配“”本身,你需要输入两个“”,
向这样“”。当然,这个符号本身也是一个元字符。
方括号之外的元字符有这些:
有数种用途的通用转义符
^
断言目标的开头(或在多行模式下行的开头,即紧随一换行符之后)
$
断言目标的结尾(或在多行模式下行的结尾,即紧随一换行符之前)
.
匹配除了换行符外的任意一个字符(默认情况下)
[
字符类定义开始
]
字符类定义结束
|
开始一个多选一的分支
(
子模式开始
)
子模式结束
?
扩展(的含义,我们已经在介绍模式修正符里看到过它的使用。它也可以是0或1数量限定符,以及数量限定符最小值
*
匹配0个或多个的数量限定符
+
匹配1个或多个的数量限定符
{
最少/最多数量限定开始
}
最少/最多数量限定结束
模式中方括号内的部分称为“字符类”。字符类中可用的元字符为:
通用转义字符
^
排除字符类,但仅当其为第一个字符时有效
-
指出字符范围
在这里,最值得一提是“”这个元字符。之所以重点对它进行讲解是因为这一个元字符有多种不同的用法,在不同情况下代表不
同的含义,而且使用频率非常高,是个很容易让人迷惑的地方。
第一种用法前面我们已经提过,是作为通用转义字符使用,如果其后跟着一个非字母数字字符,则取消该字符可能具有的任
何特殊含义。此种将反斜线用作转义字符的用法适用于无论是字符类之中还是之外。例如“”代表一个单独的反斜线“”。
第二种用途提供了一种在模式中以可见方式去编码不可打印字符的方法。模式中完全可以包括不可打印字符,除了代表模式
结束的二进制零,例如,可以用“a”代表alarm,即BEL字符(0x07),或用“cx”代表\"control-x\",其中x是任意字符。
当然,这种方法表示的不一定非得是不可打印字符,实际上,可以用“xhh(十六进制代码为hh的字符)”和“ddd(八进制代码
为ddd的字符)”来以编码的形式表达任何单字节字符,例如“040”可以用来表示空格。
反斜线的第三个用法是指定通用字符类型,这些字符类型序列可以出现在字符类之中和之外。每一个匹配相应类型中的一个
字符。如果当前匹配点在目标字符串的结尾,以上所有匹配都失败,因为没有字符可供匹配。有以下这些常见的通用字符类:
d任一十进制数字
D任一非十进制数的字符
s任一空白字符
S任一非空白字符
w任一“字”的字符
W任一“非字”的字符
反斜线的第四个用法是某些简单的断言,关于断言的讨论我们放在后面,这里先不加讨论。
反斜线的最后一个用法是逆向引用。关于逆向引用,我们会在后面讨论逆向引用的部分来做进一步的讨论。
我们已经看到,反斜线的众多用法,其中一些涉及到了以后才讲的内容。我们在模式中遇到反斜线时一定要注意它具体是哪
一种用途以免疑惑。
另外两个方括号也是非常重要的元字符,左方括号开始了一个字符类,右方括号结束之。单独一个右方括号不是特殊字符。
字符类匹配目标中的一个字符,该字符必须是字符类定义的字符集中的一个;除非字符类中的第一个字符是音调符(^),此情况下
目标字符必须不在字符类定义的字符集中。如果在字符类中需要音调符本身,则其必须不是第一个字符,或用反斜线转义。例如,
[^A-Z]表式非大写字符。
其它元字符我们会在以后的文章中结合相关内容介绍。
在上篇文章里,我们介绍了正则表达式的模式修正符与元字符,细心的读者也许会发现,这部分介绍的非常简略,而且很少有实
际的例子的讲解。这主要是因为网上现有的正则表达式资料都对这部分都有详细的介绍和众多的例子,如果觉得对前一部分缺乏
了解可以参看这些资料。本文希望可以尽可能多涉及一些较高级的正则表达式特性。
在本文里,我们主要介绍子模式(subpatterns),逆向引用(Backreferences)和量词(quantifiers),其中重点介绍对这些概
念的一些扩展应用,例如子模式中的非捕获子模式,量词匹配时的greedy与ungreedy。
子模式(subpatterns)与逆向引用(Backreferences)
正则表达式可以包含多个字模式,子模式由圆括号定界,可以嵌套。这也是两个元字符“(”和“)”的作用。子模式可以有
以下作用:
1.将多选一的分支局部化。
例如,模式:cat(aract|erpillar|)匹配了\"cat\",\"cataract\"或\"caterpillar\"之一,没有圆括号的话将匹配
\"cataract\",\"erpillar\"或空字符串。
2.将糙猎户的公主兔 子模式设定为捕获子模式(例如上面这个例子)。当整个模式匹配时,目标字符串中匹配了子模式的部分可以通过逆向引
用进行调用。左圆括号从左到右计数(从1开始)以取得捕获子模式的数。
注意,子模式是可以嵌套的,例如,如果将字符串\"theredking\"来和模式/the((red|white)(king|queen))/进行匹配,
捕获的子串为\"redking\",\"red\"以及\"king\",并被计为1,2和3,可以通过“1”,“2”,“3”来分别引用它们,“1”
包含了“2”和“3”,它们的序号是由左括号的顺序决定的。
在一些老的linux/unux工具里,子模式使用的圆括号需要用反斜线转义,向这种(subpattern),但现代的工具已经不需要
了,本文中使用的例子都不进行转义。
非捕获子模式(non-capturingsubpatterns)
用一对括号同时完成上面提到的子模式的两个功能有时会出现一些问题,例如,由于逆向引用的数目是有限的(通常最大不超
过9),而且经常会遇到无需捕匍匐的意思 获的子模式定义。这时,可以在开始的括号后加上问号和冒号来表示这个子模式无需捕获,就向下
面这样:((?:red|white)(king|queen))。
如果将“thewhitequeen”作为模式匹配的目标字符串,则捕获的字串有“whitequeen”和“queen”,分别作为“1”和
“2”,white虽然符合子模式“(?:red|white)”,但并不被捕获。
我们前面已经介绍过用括号与问号表示模式修正符的方法,为方便起见,如果需要在非捕获子模式中插入模式修正符,可以
把它直接放在问号和冒号之间,例如,下面两个模式是等效的。
/(?i:saturday|sunday)/和/(?:(?i)saturday|sunday)/。
逆向引用(Backreferences)
前面介绍反斜线作用时,已经提到它的一个作用就是表示逆向引用,当字符类之外的反斜线后跟一个大于0的十进制数时,
它很有可能是一个逆向引用。它的含义正如它的名称如言,它表示对它出现之前已经捕获的子模式的引用。这个数字代表了它引
用的左括号在模式中出现的次序,我们在介绍子模式时已经看到过逆向引用的一个例子,那里的过“1”,“2”,“3”分别
表示所捕获的第一,第二,和第三个小括号定义的子模式的内容。
值得注意的是,当反斜线后的数字小于10时,可以确定此为一个逆向引用,这样,这个逆向引用就可以出现在之前有相应数
目的左圆括号被捕获前而不会出现混淆,只有整个模式能提供那么多的捕获子模式,就不会报错。说起来似乎很混乱,还是让我
们来看下面这个例子。把介绍子模子时举的例子拿来修改一下,前面讲过字符串\"theredking\"来和模式/the((red|white)
(king|queen))/匹配,捕获的子串为\"redking\",\"red\"以及\"king\",并被计为1,2和3,现在把字符串,修改为\"king,
theredking\",模式改为/3,the((red|white)(king|queen))/,这个模式应该也是可以匹配的。不过,并非所有的正则表达
式工具都支持这种用法,安全的做法是在相应序号的左括号之后使用与之相关的逆向引用。
需要注意的另一点是逆向引用的值是在目标字符串中实际捕获的符合子模式的字符串片段而非该子模式本本身。例如/
(sens|respons)eand1ibility/会匹配“senseandsensibility”和“responseandresponsibility”,但不会是\"sense
andresponsibility\"。当被逆向引用的子模式后面有量词从而被重复匹配了多次,逆向引用的值会以最后一次匹配的值为准。例
如/([abc]){3}/匹配字符串“abc”时,逆向引用“1”的值将是最后一次匹配的结果“c”。
命名子模式(namedsubpattern)
一些工具(例如Python)可以为逆向引用命名,从而定义出命名子模式。在Python中对正则表达式的使用是以函数或方法调
用的格式,语法与这里举的例子有较大差别。有兴趣的朋友可以参看一下自己使用的工具来看看是否支持命名子模式。
重复(Repetition)和量词(quantifiers)
在前面介绍逆向引用的部分里我们已经接触到了量词(quantifi唐诗三百首古诗大全集 ers)的概念,例如前面的例子/([abc]){3}/表示三个连续的字
符,每个字符都必然是“abc”这三个字符中的一个。在这个模式里,{3}就属于量词。它表示一个模式需要重复匹配(repetition)
的数目。
量词可以放在下面这些项目之后:
●单个字符(有可能是被转义的单个字符,如xhh)
●“.”元字符
●由方括号表示的字符类
●逆向引用
●由小括号定义的子模式(除非它是个断言,我们会在以后介绍)
最通用的量词使用形式是用花括号括起的两个由逗号分隔的数字,如这样的格式{min,max},例如,/z{2,4}/可以匹配\"zz\",
\"zzz\",或者\"zzzz\",花括号中的最大值以及前面的逗号可以省略,例如/d{3,}/可以匹配三个以上的数字,数字的数目没有上
限,而/d{3}/(注意,没有逗号)则精确的匹配3个数字。当花括号出现在不允许量词的位置或者语法与前面提到的不符时,这里
它仅仅代表花括号字符本身而不再具有特殊的含义。例如{,6}不是量词,它仅仅代表这四个字符本身的含义。
为了方便,三个最常用的量词有它们的单字符缩写形式,它们的的含义如下表:
*{0,}
相当于
+{1,}
相当于
?{0,1}
相当于
这也是以上三个元字符做为量词使用含义。
在使用量词特别是没有上限限制的量词时,应该特别注意不要构成无限循环,例如/(a?)*/,在有的正则表达式工具里。这会
形成一个编译错,不过有的工具却允许这种结构,但不能保证各种工具都可以很好的处理这种结构。
量词匹配的“greedy”与“ungreedy”
在使用带量词的模式时,我们常会发现对同一模式而言,同一个目标字符串可以有多种匹配方式。例如/d{0,1}d/,可以匹
配两个或三个十进制数字,如果目标字符串是123,当量词取下限0里,它匹配“12”,当量词取上限1里,它匹配“123”整个
字符。这两种匹配结果都是正确的,如果我们取它的子模式/(d{0,1}d)/,则匹配的结果1到底是“12”还是“123”?
实际的运行结果一般会是后者,因为默认情况下,大多数正则表达式工具的匹配是按“greedy”原则匹配的。“greedy”单
词的中的含义是“贪吃的,贪婪的”的意思,它的行为也如此单词的含义,所谓greedy匹配意指在量词限制范围内,只要能保持
后续模式的匹配,匹配总是尽可能的重复下去,直到不匹配的情况发生为止。为便于理解,我们看下面这个简单的例子。
/(d{1,5})d/匹配“12345”这个字符串,这个模式表示在1到5个数字后面跟上一个数字,量词范围从1到5,当它的值
在1-4时,整个模式都是匹配的,1的值可以是“1”,“12”,“123”,“1234”,而在greedy匹配的情况下,它取匹配时
的量词最大值,因此最终匹配的结果是”1234”。
在大多数情况下,这就是我们想要的结果,但情况并不总这样。例如,我们希望用下面这个模式提取出c语言的注释部分(在
c语言中,注释语句放在字符串/*和*/之间)。我们使用的正则表达式是/*.**/,但匹配的结果却完全和需要的不同。当正则表
达式解析到“/*”这后的“.*”时,因为“.”可以代表任意字符,这也包含了其后需要匹配的“*/”,在量词的作用下,这个
匹配将一直进行下去,超过下一个“*”/直到文本的结束,这显然不是我们需要的结果。
为了完成如上例我们想要的那种匹配,正则表达式引入了ungreedy匹配方法,与greedy匹配相反,在满足整个模式匹配的
前提下,它总是取最小的量词数目结果。Ungreedy匹配用在量词后面加上问号“?”来表示。例如在匹配C语言的注释时,我们
把正则表达式写成如下形式:/*.*?*/,在量词“*”后加上问号就可以达成想要的结果。还有前面那个例子用/(d{1,5})d/匹
配“12345”这个字符串,如果改写为ungreedy模式向这样惠崇春江晚景其二古诗带拼音 /(d{1,5}?)d/,、1的值将为1。
上面的解释也许有些不准确,量词后的问号的作用实际上是反转当前的正则表达式的greedy与ungreedy行为。你可以通过
模式修正符“U”将正则表达式设成ungreedy模式然后在模式中通过量词后的问号将之反转为greedy。
一次性子模式(Once-onlysubpatterns)
关于量词的另一个有趣的话题是一次性子模式(Once-onlysubpatterns)。要理解它的概念需要先了解一下含有量词的正则表
达式的匹配过程。我们这里举个例子。
现在,让我们用模式/d+foo/来匹配字符串“123456bar”,当然,它的结果是没有匹配。但正则表达式引擎是如何工作的呢?
它先分析前面的d+,这代表一个以上的数字,然后检查目标字符串的对应位置的第一个字符“1”,符合模式,然后根据量词重
复这个模式对字符串进行匹配直到“123456”始终符合“d+”模式,接着它在目标字符串中遇到字符“b”无法与“d+”匹配,
于是查看“d+”的后续模式“foo”,与目标字符串的后续部分“bar”无法匹配,这时,有趣的事情出现了,解释引擎会对前面
已经解析过的“d+”模式进行回溯,将量词数目减少一,看剩余部分能否匹配,此时“d+”的值改为“12345”,然后解释引擎
看目标字符串剩余的部分“6bar”能否与剩余的模式“foo”相匹配,如果不行,就把量词数再减一,直到达到最小的量词限制,
如果仍无法匹配,则表明目标字符串无法匹配,返回无法匹配的结果。
现在,我们就可以来接触一次性子模式了。所谓一次性子模式就是定义在正则表达式解析时不需要上述回溯过程的子模式。
它用左圆括号后面的问号和小于号来表示,向这样(?>)。如果将上面提到的例子改为一次性子模式,可以这样书写:
/(?>d)+foo/,这时,当解析器遇到后面不匹配的bar时,会立即返回不匹配的结果,而不会进行前面提到的回溯过程。
需要了解的是,一次性子模式属于非捕获子模式,它的匹配结果不能被逆向引用。
当一个没有设定重复上限的子模式中包含了同样没有设定重复上限的模式时,使用一次性子模式是唯一可以避免让你的程序
陷入长时间等待的方法。例如你用“/(D+|
“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”,在返回最终无匹配的结果前,你会等待很长的一段时间。这个模式表示一串非数字字
符或者用尖括号括着的一串数字后跟随着叹号或者问号,把这段字符串分成两个重复的部分会有很多种分法,而无论是子模式本
身还是子模式之内的量词的各可能值都要经过逐一测试,这将使最终的运算量达到一个很大的程度。这样,你将在电脑前等待相
当长的时间才会看到结果。而如果用一次性子模式来改写刚才的模式,改成这样/((?>D+)|
算的结果。
【导读】在这篇文章里,我们将重点介绍正则表达式中的断言。
(Assertions)
在上文里,我们介绍了正则表达式的子模式,逆向引用和量词,在这篇文章里,我们将重点介绍正则表达式中的断言(Assertions)。
断言(Assertions)
断言(Assertions)是在目标字符串的当前匹配位置进行的一种测试但这种测试并不占用目标字符串,也即不会移动模式在目
标字符串中的当前匹配位置。
读起来似乎有点拗口,我们还是举几个简单的例子。
两个最常见的断言是元字符“^”和“$”,它们检查匹配模式是否出现在行首或行尾。
我们来看这个模式/^ddd$/,试着用它来匹配目标字符串“123”。“ddd”表示三个数字字符,匹配了目标字符串的三
个字符,而模式中的^和$分别表示这三个字符同时出现在行首和行曹植七步诗拼音版原文 尾,而它们本身并不与目标字符串中的任何字符相对应。
其它还有一些简单的断言b,B,A,Z,z,它们都以反斜线开头,前面我们已经介绍过反斜线的这个用法。这几个断言
的含义如下表。
断言含义
b字分界线
B非字分界线
A目标的开挥手自兹去的下一句 头(独立于多行模式)
Z目标的结尾或位于结尾的换行符前(独立于多行模式)
z目标的结尾(独立于多行模式)
G目标中的第一个匹配位置
注意这些断言竹枝词刘禹锡拼音 不能出现在字符类中,如果出现了也是其它的含义,例如b在字符类中表示反斜线字符0x08。
前面介绍的这些断言的测试都是一些基于当前位置的测试,断言还支持更多复杂的测试条件。更复杂的断言以子模式方式来
表示,它包括前向断言(Lookaheadassertions)和后向断言(Lookbehindassertions)。
前向断言(Lookaheadassertions)
前向断言从目标字符串的当前位置向前测试断言条件是否成立。前向断言又可分为前向肯定断言和前向否定断言,分别用(?=
和{?!表示。例如模式/w+(?=;)/用来表示一串文本字符后面会有一个分号,但是这个分号并不包括在匹配结果中。一件有趣的
事看起来差不多的模式/(?=;)w+/并不是表示一串前面不是分号的alpha字符串,事实上,不论这串alpha字符的前面是否是一
个分号它总是匹配的,要完成这个功能需要我们下面提到的后向断言(Lookbehindassertions)。
后向断言(Lookbehindassertions)
后向断言分别用(?<=和(?(?bar/将寻找一个前面不是foo的bar
字符串。一般而言,后向断言使用的子模式需要有确定的长度值,否则会产生一个编译错误。
使用后向断言与一次性子模式搭配使用可以有效的文本的结束部分进行匹配,这里来看一下例子。
考虑一下如果用/abcd$/这样一个简单的模式来匹配一长段以abcd结尾的文本,因为模式的匹配过程是从左向右进行的,正
则表达式引擎将在文本中寻找每一个a字符并尝试匹配剩余的模式,如果在这长段文本里仅好有不少的a字符,这样做明显是非
常低效的,而如果把以上模式换成为样/^.*abcd$/,这时前面的“^.*”部分将匹配整个文本,然后它发现下一个模式a无法匹配,
这时会发生前面提到过的回溯过程,解析器会逐次缩短“^.*”匹配的字符长度从右向左逐次查找剩余的子模式,也要产生多次的
尝试过程。现在,我们用一次性子模式与后向断言重写所用的模式,改为/^(?>.*)(?<=abcd)/,这时,一次性子模式一次匹配了
整段文本,然后用后向断言检查前面四个字符是否为abcd,只需要一次检测就可以立刻确定整个模式是否匹配。在遇到需要匹配
一个很长的文本时,这种方法可以非常显著的提高处理效率。
一个模式中可以包含多个相继的断言,断言也可以嵌套。另外,断言使用的子模式也是非捕获的,不能被逆向引用。
断言的一个重要应用领域就是做为条件子模式的条件。那什么是条件子模式呢?
条件子模式(Conditio慈悲的近义词是什么 nalsubpatterns)
正则表达式允许在模式中根据不同的条件使用不同的匹配子模式。也就是条件子模式(Conditionalsubpatterns)。它的格式
如下:(?(condition)yes-pattern)或者(?(condition)yes-pattern|no-pattern)。如果条件满足,采用yes-pattern,否则,采
用no-pattern(如果在模式中提供了话)。
条件子模式中的条件有两种,一种是断言结果,另一种是看是否捕获一个前面提供的子模式。
如果在表示条件的圆括号里的内容是一个数字,它表示当此数字代表的子模式被成功匹配时条件为真。看看下面这个例子,
/(()?[^()]+(?(1)))/x,(注意“x”模式修正符表示忽略字符类外的空白字符和#符号之后的内容)。
这个模式的第一部分“(()?”匹配了一个可选的左图括号“(”,第二部分“[^()]+”匹配了一个以上的非圆括号字符,
最后一部分“(?(1)))”是个条件子模式,表示如果捕获到1也即那个可选的左圆括号,第三部分应该会出现一个右圆括号“)”。
如果在表示条件的圆括号内是一个“R”字符,表示在这个模式或子模式被递归调用时条件为真,在递归调用的顶层,这个条
件为假。关于正则表达式中的递归,我们会在后面的部分专题介绍。
如果条件不是一个数字或R字符,则它必需是一个断言。断言可以是肯定或否定的前身或后向断言。让我们看下面这个例子。
/(?(?=[^a-z]*[a-z])
d{2}-[a-z]{3}-d{2}|d{2}-d{2}-d{2})/x
为了让这个正则表达式更容易阅读,我们特意采用了x模式修正符,这样我们可以在用模式中加入空格对符式进行格式上的
分隔并分行表示而不影响模式的解析。
第一行的条件子模式使用了一个肯定的前向断言,表示一串可选的非小写字母后面跟随着一个小写字母。换句话说,它查看
目标字符串是否至少包含一个小写字母,如果是,它用“|”前的模式对目标进行匹配,看目标是否为看目标是否为两个数字-三
个小写字母-两个数字这种格式,否则,用“|”来匹配目标,看目标字符串是否为由“-”分隔的三段二位十进制数字。
正则表达式中的注释
为了让正则表达式更容易阅读,可以在其中加入注释语句。通常注释由左圆括关于中秋节的五言绝句的诗 号和井号——“(#“开始,当遇到下一个右圆
括号”)“结束。注释是禁止嵌套的。
如果设定了“x”模式修正符,任何字符类之外(也即[]之外)的井号(#)和下一个新行标记之间的部分也被作为注释看待。
掌嘴的英文译语怎么说-三角函数特殊值表
更多推荐
caterpillar是什么意思erpillar在线翻译读音
发布评论