我有以下正则表达式来消除空格,制表符和新行:[^ \n\t]
但是,我想针对某些其他字符展开此功能,例如>
和<
。
我尝试[^ \n\t<>]
,现在效果很好,但如果<
或>
前面有\
,我希望表达式不匹配。
我尝试[^ \n\t[^\\]<[^\\]>]
,但这不起作用。
答案 0 :(得分:4)
以下任何一个序列都可以出现在您的输入中吗?
\\>
\\\>
\\\\>
\
blank
\
tab
\
newline
...
如果是这样,您如何建议对待它们?
如果没有,那么只要您的正则表达式引擎支持它,zero-width look-behind assertions就可以完成。任何支持Perl风格的正则表达式(包括Perl,PHP等)的引擎都会出现这种情况:
(?<!\\)[ \n\t<>]
以上内容将匹配任何未转义的空格,换行符,制表符或带角度的大括号。更一般地说(使用\s
表示任何空格字符,包括\r
):
(?<!\\)\s
或者,使用补充表示法而不需要零宽度的后视断言(但可以说效率较低):
(?:[^ \n\t<>]|\\[<>])
您也可以使用后者的变体来处理\\>
,\\\>
,\\\\>
等情况以及一些有限数量的前面反斜杠,例如:< / p>
(?:[^ \n\t<>]|(?:^|[^<>])[\\]{1,3,5,7,9}[<>])
答案 1 :(得分:0)
括号表达式是列表 由[和]括起来的字符。它 匹配其中的任何单个字符 列表;如果是第一个字符 list是插入符号^然后它匹配 任何不在列表中的字符。
这意味着您无法匹配一系列字符,例如\&lt;或\ \>只有一个字符。
除非你有一个使用Perl正则表达式支持构建的grep版本,否则你可以使用像所提到的其他海报之类的外观。并非所有版本的grep都有此支持。
答案 2 :(得分:-1)
也许你可以使用egrep并将你的模式字符串放在引号内。这应该消除了逃避的必要性。