用正则表达式匹配特殊字符

iBu*_*Bug 10 regular-expression

说如果我想找到包含小写字母和数字的东西,这很容易

生产文本| grep -E '[0-9a-z]'

括号对于匹配一组字符很有用,但是那些有点特殊的呢?
如果我想使用括号,匹配任何字符,但其中之一:一个右括号],破折号(或连字符)“ - ”,两个斜线/和\,插入符号^,一个冒号:。
它看起来像这样(我知道这行不通)?

[^]-/\^:]

don*_*sti 11

要匹配括号表达式中的文字]和文字-,您必须像这样使用它们:

[^]/\^:-]
Run Code Online (Sandbox Code Playgroud)

或者,甚至更好,因为某些工具需要转义反斜杠:

[^]/\\^:-]
Run Code Online (Sandbox Code Playgroud)

即,
如果右方括号 ( ']' ) 出现在列表中的第一个位置(在初始的 '^' 之后,如果有)
和
连字符减号字符将失去其特殊含义并在括号表达式中表示自己如果它首先出现(在初始的 '^' 之后,如果有的话)或最后出现在列表中,则被视为它本身,
因此
如果括号表达式指定了 '-' 和 ']',则应首先放置 ']'(在'^'(如果有)和括号表达式中的最后一个 '-'。ERE和BRE 的
括号表达式规则相同。

  • 为了安全起见,我会将反斜杠加倍。例如,许多 `awk` 实现和 `perl` 都需要它。 (2认同)
  • @iBug - 确保它失败了,因为如果你想从字面上匹配它,右括号必须是第一个。我不确定我是否理解你提到的“范围”的意思,因为`^` 是在`]` 之后,所以即使`^` 和`]` 都按字面处理,`[^-]]` 也不起作用(就像`[ba]`)。无论如何,如果您想从例如`;` 匹配到右括号,您可以使用直到`]`(这是反斜杠)之前的字符的范围,并包含`]` 作为括号表达式中的第一个字符,例如`[] ;-\\]`。 (2认同)

roa*_*ima 7

也许奇怪的是,您需要在特定位置有几个字符。您必须将其]作为集合中的第一个字符,并且-必须是集合中的最后一个字符。

这是满足您要求的 RE [^]\^/-]::

echo 'Hello[world]-[sun] ^^ 4/5 or 3\4' | grep -Eo '[^]\^/-]' | xargs
H e l l o [ w o r l d [ s u n 4 5 o r 3 4
Run Code Online (Sandbox Code Playgroud)