正则表达式

正则表达式

“正则表达式”在这里重定向。对于漫画书,请参阅Re:Gex

正则表达式,正则表达式或正则表达式(有时也称之为理想表达式),是在理论计算机科学和形式语言理论,一个序列字符定义一个搜索模式。通常这种模式随后被串搜索算法的“查找”或“查找和替换”操作的字符串,或输入验证。

这个概念出现在20世纪50年代,当时美国数学家斯蒂芬科尔克勒恩正式描述了一种正规语言这个概念在Unix文本处理实用程序中普遍使用自20世纪80年代以来,存在用于编写正则表达式的不同语法,其中一个是POSIX标准,另一个是广泛使用的Perl语法。

搜索引擎中使用正则表达式,在文本处理实用程序(如sedAWK)以及词法分析中搜索并替换文字处理器文本编辑器的对话框许多编程语言提供正则表达式功能,内置或通过

基本概念

正则表达式(通常称之为模式)是用于指定特定用途所需的一组字符串的表达式。指定一组有限的字符串的简单方法是列出其元素或成员。但是,通常由更简单的方式来指定所需的一组字符串。例如,包括三个字符串“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|ä)ndelH(ä|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-][-abc]请注意,反斜杠转义是不允许的。如果]字符是第一个(后面的^)字符,则字符可以包含在括号表达式中[]abc]

[^ ] 匹配括号内不包含的单个字符。例如,[^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)。
贪婪匹配(.*)
非贪婪匹配(.*?)
贪婪匹配和非贪婪匹配

 

posted @ 2018-06-12 22:50  Ryansuperwa  阅读(149)  评论(0编辑  收藏  举报