在正则表达式中,哪些字符需要转义?

Lan*_*nes 29 shell regular-expression

一般来说,正则表达式中的哪些字符需要转义?

例如,以下在语法上不正确:

echo '[]' | grep '[]'
grep: Unmatched [ or [^
Run Code Online (Sandbox Code Playgroud)

然而,这在语法上是正确的:

echo '[]' | grep '\[]'
[]
Run Code Online (Sandbox Code Playgroud)

是否有任何文档说明哪些字符应该在正则表达式中转义,哪些不应该?

Mat*_*teo 17

这取决于应用程序。在您的示例中,[必须将其引用为grep但不是的参数echo。

对于外壳(来自POSIX 规范):

引用用于删除某些字符或单词对 shell 的特殊含义。引用可用于保留下一段特殊字符的字面含义,防止保留字被识别为此类,并防止此处文档处理中的参数扩展和命令替换(请参阅此处文档)。

申请书如需代表本人,应引用下列文字:

|  &  ;  <  >  (  )  $  `  \  "  '  <space>  <tab>  <newline>
Run Code Online (Sandbox Code Playgroud)

在某些情况下可能需要引用以下内容。也就是说,这些字符可能是特殊的,具体取决于本 IEEE Std 1003.1-2001 卷中其他地方描述的条件:

*   ?   [   #   ˜   =   %
Run Code Online (Sandbox Code Playgroud)

各种引用机制是转义字符、单引号和双引号。here-document 代表另一种引用形式;请参阅此处文档。

特定程序(使用正则表达式、perl、awk)可能对转义有额外的要求。


pab*_*ouk 12

正则表达式有多种类型,特殊字符集取决于特定类型。其中一些描述如下。在所有情况下,特殊字符都由反斜杠转义\。例如匹配[你写\[。或者,字符(除了^)可以通过将它们一一包含在方括号中来转义,例如[[]。

在某些上下文中特殊的字符^(例如(子)表达式开头的特殊字符)可以在所有上下文中进行转义。

正如其他人所写:在 shell 中,如果您没有将表达式括在单引号之间,则必须在已经转义的正则表达式中额外转义 shell 的特殊字符。示例:'\['您可以在 Bourne 兼容的 shell 中编写\\[(或者:"\["或"\\["),例如 bash,但这是另一回事。

基本正则表达式 (BRE)

  • POSIX:基本正则表达式
  • 命令:grep,sed
  • 特殊的角色: .[\
  • 在某些情况下特殊: *^$
  • 转义字符串: "$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"

扩展正则表达式 (ERE)

  • POSIX:扩展正则表达式
  • 命令:grep -E, GNU: sed -r, *BSD:sed -E
  • 特殊的角色: .[\(
  • 在某些情况下特殊: *^$)+?{|
  • 转义字符串: "$(printf '%s' "$string" | sed 's/[.[\*^$()+?{|]/\\&/g')"

  • 请注意,如果您在例如`sed 's/regex/replace/'` 或在`sed 's#regex#replace#` 中使用这样的转义字符串作为正则表达式的一部分,则必须转义`/` 或` #` 字符,分别。如果你在 `awk '/regex/'` 中使用它,你必须在正则表达式中转义 `/` 字符。 (2认同)

Arc*_*ege 9

每个应用程序都有自己的一组“特殊”字符。您遇到的问题grep不是外壳。对于哪些字符需要在 中引用grep,请阅读联机帮助页中关于“正则表达式”的部分。

对于 shell,应该引用的字符是:

;'"`#$&*?[]<>{}\
Run Code Online (Sandbox Code Playgroud)

和任何空格。

根据 shell,可能还需要引用其他字符:

!^%
Run Code Online (Sandbox Code Playgroud)

查看 shell 联机帮助页上的“SHELL GRAMMAR”。