我有以下用于消除空格、制表符和新行的正则表达式:[^ \n\t]
但是,我想将其扩展为某些附加字符,例如>
和<
。
我试过[^ \n\t<>]
了,现在效果很好,但是如果<
or>
前面有一个,我希望表达式不匹配\
。
我试过[^ \n\t[^\\]<[^\\]>]
了,但这没有用。
您的输入中是否可以出现以下任何一个序列?
\\>
\\\>
\\\\>
\
blank
\
tab
\
newline
...
如果是这样,您打算如何对待他们?
如果没有,那么只要您的正则表达式引擎支持,零宽度的后视断言就可以解决问题。任何支持 Perl 风格正则表达式的引擎(包括 Perl、PHP 等)都会出现这种情况:
(?<!\\)[ \n\t<>]
以上将匹配任何未转义的空格、换行符、制表符或尖括号。更一般地(\s
用于表示任何空格字符,包括\r
):
(?<!\\)\s
或者,使用互补符号而不需要零宽度的后视断言(但可以说效率较低):
(?:[^ \n\t<>]|\\[<>])
您还可以使用后者的变体来处理\\>
,\\\>
等\\\\>
情况,以及前面的反斜杠数量有限,例如:
(?:[^ \n\t<>]|(?:^|[^<>])[\\]{1,3,5,7,9}[<>])
根据grep 手册页:
方括号表达式是由 [ 和 ] 括起来的字符列表。它匹配该列表中的任何单个字符;如果列表的第一个字符是插入符号 ^,则它匹配不在列表中的任何字符。
这意味着您不能仅匹配单个字符,例如 \< 或 \>。
除非您有使用 Perl 正则表达式支持构建的 grep 版本,否则您可以像提到的其他海报之一那样使用环视。不过,并非所有版本的 grep 都具有此支持。
也许您可以使用egrep并将您的模式字符串放在引号内。这应该消除逃避的需要。