将特殊字符与正则表达式匹配


10

如果我要查找包含小写字母和数字的内容,这很容易

Produce_text | grep -E'[0-9a-z]'

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

[^]-/ \ ^:]

Answers:


11

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

[^]/\^:-]

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

[^]/\\^:-]

也就是说,
如果右方括号(']')出现在列表的第一个位置(如果有首字母'^',则在括号中),它将失去其特殊的含义并在方括号表达式中表示自己,
并且
连字符-减号应如果它首先出现在列表中(如果有首字母'^'之后)或最后出现,则被视为自身,
因此,
如果括号表达式同时指定了'-'和']',则应将']'放在首位( '^'(如果有))和'-'在方括号表达式内最后。
方括号表达式的规则对于EREBRE相同。


2
为了安全起见,我会将反斜杠加倍。例如,许多awk实现都需要它perl
斯特凡Chazelas

“从插入号到右括号”呢?喜欢[^-]](此失败)?
iBug

2
@iBug-确保它失败,因为如果要按字面意义匹配,则必须在右括号之前。我不知道我得到的“范围”的一点,你提到的^是后]这样[^-]]就不即使两个工作^]字面上对待(就像[b-a])。无论如何,如果您想从例如匹配;到右括号,则可以使用一个范围,直到char之前的字符](反斜杠),并将其]作为第一个char 包括在方括号表达式中,例如[];-\\]
don_crissti

@don_crissti怎么样[[.^.]-[.-.]]?我感觉这会起作用。假设的ASCII码在^之前-
iBug

我的问题有个懒惰的解决方案。只需获取整理字符的所有特殊内容,例如[^[.].][.-.]/\^:]
iBug

7

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

这是一个符合您要求的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

1
并不是很奇怪,只是有必要避免歧义
Kevin

1
第二个[角色不属于该角色;OP不想排除它。
斯科特,

@斯科特很好发现,谢谢。答案已更新。
roaima
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.