在grep中使用转义字符

sam*_*moz 9 regex escaping

我有以下正则表达式来消除空格,制表符和新行: [^ \n\t]

但是,我想为某些其他字符扩展它,例如><.

我尝试过[^ \n\t<>],现在效果很好,但我希望表达式不匹配,如果<>前面有一个\.

我试过了[^ \n\t[^\\]<[^\\]>],但这没用.

vla*_*adr 4

您的输入中是否可以出现以下任一序列?

\\>
\\\>
\\\\>
\blank
\tab
\newline
...

如果是这样,您建议如何对待他们?

如果没有,那么零宽度后向断言就可以解决问题,前提是您的正则表达式引擎支持它。在任何支持 Perl 风格的正则表达式(包括 Perl、PHP 等)的引擎中都会出现这种情况:

 (?<!\\)[ \n\t<>]
Run Code Online (Sandbox Code Playgroud)

上面的内容将匹配任何未转义的空格、换行符、制表符或尖括号。更一般地(用于\s表示任何空格字符,包括\r):

 (?<!\\)\s
Run Code Online (Sandbox Code Playgroud)

或者,使用补充符号而不需要零宽度后向断言(但可以说效率较低):

 (?:[^ \n\t<>]|\\[<>])
Run Code Online (Sandbox Code Playgroud)

您还可以使用后者的变体来处理\\>\\\>\\\\>情况以及最多有限数量的前置反斜杠,例如:

 (?:[^ \n\t<>]|(?:^|[^<>])[\\]{1,3,5,7,9}[<>])
Run Code Online (Sandbox Code Playgroud)