9

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

但是,我想将其扩展为某些附加字符,例如><

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

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

4

3 回答 3

4

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

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

如果是这样,您打算如何对待他们?

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

 (?<!\\)[ \n\t<>]

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

 (?<!\\)\s

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

 (?:[^ \n\t<>]|\\[<>])

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

 (?:[^ \n\t<>]|(?:^|[^<>])[\\]{1,3,5,7,9}[<>])
于 2009-03-25T20:49:04.910 回答
0

根据grep 手册页

方括号表达式是由 [ 和 ] 括起来的字符列表。它匹配该列表中的任何单个字符;如果列表的第一个字符是插入符号 ^,则它匹配不在列表中的任何字符。

这意味着您不能仅匹配单个字符,例如 \< 或 \>。

除非您有使用 Perl 正则表达式支持构建的 grep 版本,否则您可以像提到的其他海报之一那样使用环视。不过,并非所有版本的 grep 都具有此支持。

于 2009-03-25T20:50:54.047 回答
-1

也许您可以使用egrep并将您的模式字符串放在引号内。这应该消除逃避的需要。

于 2009-03-25T19:18:26.610 回答