跳转到内容

正则表达式/POSIX 基本正则表达式

来自维基教科书,开放的书籍,为开放的世界

POSIX 基本正则表达式 (BRE) 语法提供了扩展,以实现 grep、sed 和 awk 等实用程序之间的兼容性。这些扩展不受某些传统 Unix 工具实现的 支持。

传统的 Unix 正则表达式语法遵循常见的约定,这些约定通常因工具而异。POSIX 基本正则表达式语法由 IEEE 发展而来,并与称为 扩展正则表达式 语法的扩展变体一起发展。这些标准的设计主要为了提供对传统 简单正则表达式 语法的向后兼容性,提供一个通用标准,该标准后来被采用为许多 Unix 正则表达式工具的默认语法。

在 POSIX 基本正则表达式语法中,大多数字符被视为字面量 - 它们仅匹配自身(例如,a 匹配“a”)。以下列出的例外称为元字符元序列

元字符 描述
. 匹配任何单个字符(许多应用程序不包括换行符,并且哪些字符被认为是换行符是特定于风格、字符编码和平台的,但可以安全地假设换行符字符包含在内)。在 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”的小写字母的单个字符。这些形式可以混合使用:[^abcx-z] 匹配除“a”、“b”、“c”、“x”、“y”或“z”以外的任何字符。

如果 - 字符是最后一个字符或 ^ 后的第一个字符,则它被视为字面量字符:[^abc-][^-abc]。如果 ] 字符是 ^ 后的第一个字符,则它被视为字面量字符:[^]abc]。表达式也可以包含 字符类等价类排序字符

^ 如果它是正则表达式的第一个字符,则匹配字符串内的起始位置。
$ 如果它是正则表达式的最后一个字符,则匹配字符串的结束位置。
* 匹配前面的元素零次或多次。例如,ab*c 匹配“ac”、“abc”、“abbbc”等。[xyz]* 匹配“”, “x”、“y”、“z”、“zx”、“zyx”、“xyzzy”等等。
BRE: \{m\}
ERE: {m}
匹配前面的元素恰好 m 次。例如,a\{3\} 仅匹配“aaa”。
BRE: \{m,\}
ERE: {m,}
匹配前面的元素至少 m 次。例如,a\{3,\} 匹配“aaa”、“aaaa”、“aaaaa”、“aaaaaa”、“aaaaaaa”等等。
BRE: \{m,n\}
ERE: {m,n}
匹配前面的元素至少 m 次,但不超过 n 次。例如,a\{3,5\} 仅匹配“aaa”、“aaaa”和“aaaaa”。这在一些较旧的正则表达式实例中找不到。
BRE: \( \)
ERE: ( )
定义一个子表达式。它被视为单个元素。例如,ab* 匹配“a”、“ab”、“abb”等等,而 \(ab\)* 匹配“”, “ab”、“abab”、“ababab”等等。括号内匹配的字符串可以在以后被召回(参见下一项,\n)。子表达式也称为标记子表达式、块或捕获组。
BRE 仅限:\n 匹配第 n 个标记子表达式匹配的内容,其中 n 是从 1 到 9 的数字。此结构在理论上是不规则的(具有此结构的表达式不符合正则表达式的数学定义),并且未被采用在 POSIX ERE 语法中。

示例

  • .at 匹配以“at”结尾的任何三个字符字符串,包括“hat”、“cat”和“bat”。
  • [hc]at 匹配“hat”和“cat”。
  • [^b]at 匹配由 .at 匹配的所有字符串,除了“bat”。
  • ^[hc]at 匹配“hat”和“cat”,但仅匹配字符串或行的开头。
  • [hc]at$ 匹配“hat”和“cat”,但仅匹配字符串或行的结尾。
  • \[.\] 匹配任何被 "[" 和 "]" 包围的单个字符,因为括号被转义,例如:“[a]”和“[b]”。

字符类

[编辑 | 编辑源代码]

POSIX 标准定义了一些字符类或类别,如下所示。这些类在方括号内使用。

POSIX 类 类似于 含义
[:upper:] [A-Z] 大写字母
[:lower:] [a-z] 小写字母
[:alpha:] [A-Za-z] 大写和小写字母
[:digit:] [0-9] 数字
[:xdigit:] [0-9A-Fa-f] 十六进制数字
[:alnum:] [A-Za-z0-9] 数字、大写和小写字母
[:punct:] 标点符号(除字母和数字之外的所有图形字符)
[:blank:] [ \t] 仅空格和制表符字符
[:space:] [ \t\n\r\f\v] 空格(空白)字符
[:cntrl:] 控制字符
[:graph:] [^ [:cntrl:]] 图形字符(所有具有图形表示的字符)
[:print:] [[:graph:] ] 图形字符和空格

例如,

  • a[[:digit:]]b 匹配“a0b”、“a1b”……“a9b”。
  • a[:digit:]b 是错误的:字符类必须在方括号内
  • [[:digit:]abc] 匹配任何数字、“a”、“b”和“c”。
  • [abc[:digit:]] 与上面相同
  • [^ABZ[:lower:]] 匹配除小写字母、A、B 和 Z 之外的任何字符。

排序符号

[编辑 | 编辑源代码]

排序符号,与字符类类似,在方括号内使用,形式为 [.ch.]。这里 ch 是一个二合字。排序系统由区域设置定义。

等价类

[编辑 | 编辑源代码]

等价类,与字符类和排序符号类似,在方括号内使用,形式为 [=a=]。它们代表与给定字符等价的任何字符。根据标准[1]

例如,如果“a”、“à”和“â”属于同一个等价类,那么“[[=a=]b]”、“[[=à=]b]”和“[[=â=]b]”都等价于“[aàâb]”。

等价类,就像排序符号一样,是由区域设置定义的。

[编辑 | 编辑源代码]

工具中的使用

[编辑 | 编辑源代码]

使用这种正则表达式语法的工具和语言包括

华夏公益教科书