正则表达式
正则表达式
“正则表达式”在这里重定向。对于漫画书,请参阅Re:Gex。
正则表达式,正则表达式或正则表达式(有时也称之为理想表达式),是在理论计算机科学和形式语言理论,一个序列字符定义一个搜索模式。通常这种模式随后被串搜索算法的“查找”或“查找和替换”操作的字符串,或输入验证。
这个概念出现在20世纪50年代,当时美国数学家斯蒂芬科尔克勒恩正式描述了一种正规语言。这个概念在Unix文本处理实用程序中普遍使用。自20世纪80年代以来,存在用于编写正则表达式的不同语法,其中一个是POSIX标准,另一个是广泛使用的Perl语法。
在搜索引擎中使用正则表达式,在文本处理实用程序(如sed和AWK)以及词法分析中搜索并替换文字处理器和文本编辑器的对话框。许多编程语言提供正则表达式功能,内置或通过库。
基本概念
正则表达式(通常称之为模式)是用于指定特定用途所需的一组字符串的表达式。指定一组有限的字符串的简单方法是列出其元素或成员。但是,通常由更简单的方式来指定所需的一组字符串。例如,包括三个字符串“Handel”,“Händel”,“Haendel”的集合可以由该模式,指定 H(ä|ae?)ndel;我们说这个模式匹配三个字符串中的每一个。在大多数形式主义中,如果至少存在一个与特定集合相匹配的正则表达式,则存在无限数量的其他正则表达式也与其匹配-规范不是唯一的。大多数形式主义提供以下操作来构造正则表达式。
布尔“或”
一个竖线分隔的代替品。例如,可以匹配“灰色”或者“灰色”。gray|grey
分组
圆括号用于定义运算符的范围和优先级(以及其他的用途)。例如,gray|grey 和是等效型态,其都描述该组“灰色”或“灰色”。 gr(a|e)y
定量
最常用的量词是问号?, 星号* 和 加号+。
? 问号表示前一个元素的零次或者一次出现。例如,colou?r
匹配“颜色”和“颜色”。
* 星号表示前面元素的零次或者多次出现。例如,ab*c 匹配“ac”,“abc”,“abbc”,“abbbc”等。
+ 加号表示前一个元素的一个或多个出现。例如,ab+c匹配“abc”,“abbbbc”等
{n} 前面的项目正好匹配n次。
{min}. 前面的项目匹配最少或更多次。
{min,max} 前面的项目至少匹配最小时间,但是不超过最大时间。
这些构造可以组合形成任意复杂的表达式,就像可以用数字和操作+,-,×和÷构造算术表达式。例如,H(ae?|ä)ndel
并且都是与前面的示例匹配相同字符串的有效模式。H(a|ae|ä)ndel
H(ä|ae?)ndel
正则表达式的精准语法因工具和环境而异
标准
在IEEE POSIX标准有三套合规性:BRE(基本正则表达式),[28] ERE(扩展正则表达式),和SRE(简单的正则表达式)。SRE被弃用,[29]赞成BRE,因为两者都提供向后兼容性。涵盖角色类的下面的小节适用于BRE和ERE。
BRE和ERE一起工作。ERE增加了?
,+
和|
,并且它消除了转义元字符的需要,( )
并且{ }
这是BRE 中所需的。此外,只要坚持使用正则表达式的POSIX标准语法,就可以并经常使用额外的语法来服务特定的(但符合POSIX的)应用程序。虽然POSIX.2保留了一些未定义的实现细节,但BRE和ERE提供了一种“标准”,此后已被采纳为许多工具的默认语法,其中BRE或ERE模式的选择通常是受支持的选项。例如,GNU grep有以下选项:用于ERE的“grep -E”,用于BRE的“grep -G”(默认)和用于Perl正则表达式的“grep -P”。
Perl正则表达式已经成为事实上的标准,拥有丰富而强大的原子表达式。Perl没有“基本”或“扩展”级别。如在POSIX ERES,( )
并且{ }
被视为元字符除非转义; 已知其他元字符是仅基于上下文的文字或符号。其他功能包括延迟匹配,回溯,命名捕获组和递归模式。
POSIX基本和扩展
在POSIX标准,基本正语法(BRE)要求的元字符 ( )
和{ }
指定\(\)
和\{\}
,而扩展正语法(ERE)没有。
元字符 | 描述 |
---|---|
^ |
匹配字符串中的起始位置。在基于行的工具中,它匹配任何行的起始位置。 |
. |
匹配任何单个字符(许多应用程序不包括换行符,并且确切地哪些字符被视为换行符是flavor,character-encoding和平台特定的,但假设换行符包含在内是安全的)。在POSIX括号表达式中,点号字符与字面点相匹配。例如,a.c 匹配“abc”等,但[a.c] 只匹配“a”,“。”或“c”。 |
[ ] |
一个括号表达式。匹配括号中包含的单个字符。例如,[abc] 匹配“a”,“b”或“c”。[a-z] 指定与从“a”到“z”的任何小写字母匹配的范围。这些形式可以混合使用:[abcx-z] 与“a”,“b”,“c”,“x”,“y”或“z”匹配[a-cx-z] 。
如果 |
[^ ] |
匹配括号内不包含的单个字符。例如,[^abc] 匹配除“a”,“b”或“c”以外的任何字符。[^a-z] 匹配从“a”到“z”不是小写字母的任何单个字符。同样,文字字符和范围可以混合使用。 |
$ |
匹配字符串的结束位置或恰好在以字符串结尾的换行符之前的位置。在基于行的工具中,它匹配任何行的结束位置。 |
( ) |
定义一个标记的子表达式。在括号内匹配的字符串可以稍后调用(请参阅下一个条目)。标记的子表达也被称为块或捕获组。BRE模式需要。\n \( \) |
\n |
匹配第n个标记的子表达式匹配的内容,其中n是从1到9的数字。这个构造在POSIX.2标准中被模糊地定义。一些工具允许引用超过九个捕获组。 |
* |
匹配前面的元素零次或多次。例如,ab*c 匹配“ac”,“abc”,“abbbc”等[xyz]* 匹配“”,“x”,“y”,“z”,“zx”,“zyx”,“xyzzy”等。(ab)* 匹配“,”ab“,”abab“,”ababab“等。 |
{m,n} |
匹配前面的元素至少m且不超过n次。例如,a{3,5} 仅匹配“aaa”,“aaaa”和“aaaaa”。这在几个较老的正则表达式中找不到。BRE模式需要\{m,n\} 。 |
例子:
.at
匹配任何以“at”结尾的三个字符的字符串,包括“hat”,“cat”和“bat”。[hc]at
匹配“帽子”和“猫”。[^b]at
匹配.at
除“bat”之外匹配的所有字符串。[^hc]at
匹配.at
除“帽子”和“猫”以外匹配的所有字符串。^[hc]at
匹配“帽子”和“猫”,但只在字符串或行的开头。[hc]at$
匹配“帽子”和“猫”,但只在字符串或行的末尾。\[.\]
由于方括号被转义,例如:“[a]”和“[b]”,所以匹配由“[”和“]”包围的任何单个字符。s.*
匹配s后跟零个或多个字符,例如:“s”和“saw”和“seed”。
如:String str="abcaxc"; Patter p="ab*c"; 贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c)。 非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c)。 贪婪匹配(.*) 非贪婪匹配(.*?)