REGEX - Linux手册页
Linux程序员手册 第7部分
更新日期: 2020-08-13
名称
regex-POSIX.2正则表达式
说明
POSIX.2中定义的正则表达式(" RE")有两种形式:现代RE(大约是egrep的那些; POSIX.2称这些为"扩展的" RE)和过时的RE(大约是ed(1)的那些) ; POSIX.2"基本" RE)。在某些旧程序中,过时的RE大多是为了向后兼容而存在的。他们将在最后讨论。 POSIX.2保留了RE语法和语义的某些方面; "(!)"标记可能无法完全移植到其他POSIX.2实现中的这些方面的决定。
一个(现代)RE是一个(!)或多个非空(!)分支,以aq | aq分隔。它匹配任何与分支之一匹配的东西。
分支是一个(!)或多个连接的片段。它匹配第一个匹配项,然后匹配第二个匹配项,依此类推。
一块是一个原子,后面可能跟着一个单(!)aq * aq,aq + aq,aq?aq或边界。紧跟aq * aq的原子与该原子的0个或多个匹配项匹配。紧跟aq + aq的原子与该原子的1个或更多个匹配项匹配。紧跟aq?aq的原子与该原子的0或1个匹配项的序列匹配。
边界是aq {aq,后跟无符号十进制整数,可能后跟aq,aq可能后跟另一个无符号十进制整数,始终后跟aq} aq。整数必须介于0到RE_DUP_MAX(255(!))之间(包括两端),并且如果有两个整数,则第一个整数不得超过第二个。一个原子后跟一个包含一个整数i且没有逗号的界限,它与该原子的i个完全匹配的序列匹配。一个原子后跟一个包含一个整数i和一个逗号的界线,与该原子的i个或更多个匹配项的序列匹配。一个原子后跟一个包含两个整数i和j的边界,与该原子的i至j(包括)匹配序列相匹配。
原子是包含在"()"中的正则表达式(匹配正则表达式的匹配项),空集"()"(匹配空字符串)(!),方括号表达式(请参见下文),aq。 aq(匹配任何单个字符),aqhaaq(匹配行开头的空字符串),aq $ aq(匹配行末尾的空字符串),aq \ aq,后跟字符之一" ha" 。[$()| * +?{"(匹配该字符作为普通字符),aq \ aq,然后跟任何其他字符(!)(匹配该字符作为普通字符,就像aq \ aq尚未出现(!)),或没有其他意义的单个字符(与该字符匹配)。 aq {aq后跟数字以外的其他字符是普通字符,而不是bound(!)的开头。以aq \ aq结束RE是非法的。
方括号表达式是用" []"括起来的字符列表。它通常与列表中的任何单个字符匹配(但请参见下文)。如果列表以aqhaaq开头,则它匹配任何单个字符(但请参见下文),而不是列表的其余部分。如果列表中的两个字符用aq-aq隔开,则这是整理序列中这两个字符(包括两个字符)之间的完整字符的缩写,例如,ASCII中的" [0-9]"与任何十进制数字匹配。两个范围共享一个端点是非法的(!),例如" a-c-e"。范围是非常依赖整理顺序的,可移植程序应避免依赖它们。
要在列表中包括文字aq] aq,请使其成为第一个字符(紧随其后的aqhaaq)。要包含文字aq-aq,请将其设为第一个或最后一个字符,或范围的第二个端点。要将文字aq-aq用作范围的第一个端点,请将其括在" [。"中。和"。]"作为整理元素(请参见下文)。除了这些以及使用aq [aq的某些组合(请参阅下一段)之外,所有其他特殊字符(包括aq \ aq)在方括号表达式中都失去其特殊意义。
在方括号表达式中,用" [。"括起来的归类元素(一个字符,一个好像要作为单个字符进行归类的多字符序列,或任何一个的归类序列名称)。 "。]"代表该整理元素的字符序列。该序列是括号表达式列表中的单个元素。因此,包含多字符归类元素的方括号表达式可以匹配多个字符,例如,如果归类序列包括" ch"归类元素,则RE" .ch。* c"与前五个字符匹配的" chchcc"。
在方括号表达式中,用[[="和" =]"括起来的排序元素是一个等效类,代表与该排序元素等效的所有排序元素的字符序列,包括它自己。 (如果没有其他等效的校对元素,则将其视为包围的分隔符为" [。"和"。]"。)例如,如果o和是等价类的成员,则" = ="," =="和" [o]"都是同义词。等价类可能不是范围的端点。
在方括号表达式中,用" [:"和":]"括起来的字符类的名称代表该类所有字符的列表。标准字符类名称为:
- 字母数字点 字母空间 Blanklowerupper cntrlprintxdigit
这些代表wctype(3)中定义的字符类。语言环境可以提供其他语言环境。字符类不能用作范围的端点。
如果RE可以匹配给定字符串的多个子字符串,则RE匹配字符串中最早的一个子字符串。如果RE从那时开始可以匹配多个子串,则它匹配最长的子串。子表达式还匹配尽可能长的子字符串,但要遵守整个匹配尽可能长的约束,其中子表达式在RE中较早开始,优先于较晚开始的子字符串。请注意,因此,较高级别的子表达式优先于其较低级别的组件子表达式。
匹配长度以字符为单位,而不是归类元素。空字符串被认为比没有匹配要长。例如,当匹配"(。)。"时," bb *"匹配" abbbc"的三个中间字符,"(wee | week)(knights | nights)"匹配" weeknights"的所有十个字符带括号的子表达式" abc"与所有三个字符匹配,并且将"((a )""与" bc"匹配时,整个RE和带括号的子表达式都与空字符串匹配。
如果指定了不区分大小写的匹配,则效果就好像所有区分大小写都从字母表中消失了一样。当在多种情况下存在的字母显示为括号表达形式之外的普通字符时,例如,aqxaq变为" [xX]",则该字符串有效地转换为包含两种情况的括号表达形式。当它出现在方括号表达式中时,所有与之对应的大小写都将添加到方括号表达式中,例如," [x]"变为" [xX]"," [hax]"变为" [haxX]"。
REs(!)的长度没有特别限制。旨在可移植的程序不应使用超过256字节的RE,因为实现可能会拒绝接受这些RE并保持POSIX兼容。
过时的("基本")正则表达式在几个方面有所不同。 aq | aq,aq + aq和aq?aq是普通字符,它们的功能没有等效项。边界的定界符是" \ {"和" }",aq {aq和aq} aq本身就是普通字符。嵌套子表达式的括号是" ("和" )",aq(aq和aq)aq本身就是普通字符。 aqhaaq是一个普通字符,除了在RE的开头或带括号的子表达式的开头(!)之外,aq $ aq是一个普通字符,除了在RE的结尾或括号的子表达式的结尾是(!)的结尾,以及aq * aq是普通字符,如果它出现在RE的开头或带括号的子表达式的开头(可能在前导aqhaaq之后)。
最后,有一种新的原子类型,即反向引用:aq \ aq后跟一个非零的十进制数字d,该字符与由d括号括起来的子表达式匹配的相同字符序列相同(按子表达式的开括号位置对它们进行编号,从左到右)。右),例如" ([bc] )\ 1"匹配" bb"或" cc",但不匹配" bc"。
BUGS
拥有两种RE是很不容易的。
当前的POSIX.2规范说aq)aq是普通字符,没有不匹配的aq(aq;这是措辞错误的无意结果,很可能会更改,请避免依赖它。
反向引用是一个可怕的缺陷,为有效实现带来了主要问题。它们的定义也有些模糊(" a ((b()** 2 )* d"匹配" abbbd"吗?)。避免使用它们。
POSIX.2的大小写无关的匹配规范不明确。上面给出的"一个案例意味着所有案例"定义是实施者之间就正确解释的当前共识。
作者
本页摘自Henry Spencer的regex软件包。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。