跳到内容

正则表达式/POSIX 扩展正则表达式

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

更高级的“扩展”正则表达式有时可以通过包含命令行标志“-E”与 Unix 实用程序一起使用。其他 Unix 实用程序,如 awk,默认情况下使用它。

主要区别在于一些反斜杠被删除:\{…\} 变成{…}以及 \(…\) 变成(…). 例子

  • "[hc]+at" 匹配 "hat", "cat", "hhat", "chat", "hcat", "ccchat" 等。
  • "[hc]?at" 匹配 "hat", "cat" 和 "at"
  • "([cC]at)|([dD]og)" 匹配 "cat", "Cat", "dog" 和 "Dog"

字符(,),[,],.,*,?,+,|,^$是特殊符号,必须用反斜杠符号进行转义才能被视为字面字符。例如

"a\.(\(|\))" 匹配字符串 "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”的小写字母的单个字符。如上所述,可以混合使用字面字符和范围。
^ 匹配字符串中的起始位置。在线性工具中,它匹配任何行的起始位置。
$ 匹配字符串的结束位置或字符串结尾换行符之前的那个位置。在线性工具中,它匹配任何行的结束位置。
BRE: \( \)
ERE: ( )
定义一个标记的子表达式。括号内匹配的字符串可以在以后被调用(见下一项,\n)。标记的子表达式也称为块或捕获组。
\n 匹配第 n 个标记的子表达式匹配的内容,其中 n 是从 1 到 9 的数字。这个结构在理论上是不规则的,并且没有在 POSIX ERE 语法中采用。一些工具允许引用超过九个捕获组。
* 匹配前面的元素零次或多次。例如,ab*c 匹配“ac”、“abc”、“abbbc”等。[xyz]* 匹配“”,"x","y","z","zx","zyx","xyzzy" 等等。\(ab\)*(在 BRE 中)或 (ab)*(在 ERE 中)匹配“”,"ab","abab","ababab" 等等。
BRE: \+
ERE: +
匹配前面的元素一次或多次。例如,ab\+c(在 BRE 中)或 ab+c(在 ERE 中)匹配“abc”、“abbbc”等,但不匹配“ac”,[xyz]\+(在 BRE 中)或 [xyz]+(在 ERE 中)匹配“x”、“y”、“z”、“zx”、“zyx”、“xyzzy” 等等。\(ab\)\+(在 BRE 中)或 (ab)+(在 ERE 中)匹配“ab”、“abab”、“ababab” 等等。
BRE: \?
ERE: ?
匹配前面的元素一次或零次。例如,ab\?c(在 BRE 中)或 ab?c(在 ERE 中)匹配“ac”或“abc”,而 \(ab\)\?(在 BRE 中)或 (ab)?(在 ERE 中)匹配"" 或 "ab"。
BRE: \|
ERE: |
匹配前面的元素或后面的元素。例如,abc\|def(在 BRE 中)或 abc|def(在 ERE 中)匹配“abc”或“def”。
BRE: \{m,n\}
ERE: {m,n}
匹配前面的元素至少 m 次,但不超过 n 次。例如,a\{3,5\}(在 BRE 中)或 a{3,5}(在 ERE 中)仅匹配“aaa”、“aaaa”和“aaaaa”。
BRE: \{m\}
ERE: {m}
匹配前面的元素正好 m 次。
BRE: \{m,\}
ERE: {m,}
匹配前面的元素至少 m 次。
BRE: \{,n\}
ERE: {,n}
匹配前面的元素不超过 n 次。例如,ba\{,2\}b(在 BRE 中)或 ba{,2}b(在 ERE 中)仅匹配“bb”、“bab”和“baab”。


字符类

[编辑 | 编辑源代码]

POSIX 标准定义了一些字符类或类别,如以下表格所示

POSIX 类 类似于 含义
[:upper:] [A-Z] 大写字母
[:lower:] [a-z] 小写字母
[:alpha:] [[:upper:][:lower:]] 大写和小写字母
[:alnum:] [[:alpha:][:digit:]] 数字、大写和小写字母
[:digit:] [0-9] [0-9]
数字 [:xdigit:] [0-9A-Fa-f]
十六进制数字 [:punct:] [.,!?:…]
标点符号 [:blank:] [ \t]
仅空格和制表符字符 [:space:] [ \t\n\r\f\v]
空白(空格)字符 [:cntrl:]
控制字符 [:graph:] [^\t\n\r\f\v]
印刷字符 [:print:] [^ \t\n\r\f\v]

印刷字符和空格

  • 链接
  • W:Regular_expression#Character_classes

始终支持的字符类 at boost.org

在工具中的使用

[编辑 | 编辑源代码]

  • 使用这种正则表达式语法的工具和语言包括
AWK - 使用扩展正则表达式语法的超集
华夏公益教科书