正则表达式匹配部分字符串,当匹配不包含特定字符串时 - PCRE grep

时间:2011-01-05 19:47:18

标签: regex grep replace textwrangler

我正在使用TextWrangler grep对多个文件执行查找/替换,并且遇到了我需要执行的最后一次查找/替换。我需要匹配">和行中<br />的第一个实例之间的任何文本,但匹配不能包含字符序列[xcol]。正则表达式的风格是Perl-Compatible(PCRE),所以lookbehind需要固定长度。

要搜索的示例文本:

<p class="x03">FooBar<br />Bar</p>
<p class="x03">FooBar [xcol]<br />Bar</p>
<p class="x06">Hello World<br />[xcol]foo[xcol]bar<br /></p>
<p class="x07">Hello World[xcol]<br />[xcol]foo[xcol]bar<br /></p>  

正则表达式的期望行为:
第1行匹配 "> FooBar <br />
第二行不匹配
第3行匹配 "> Hello World <br />
第4行不匹配

"><br />之间的文本将被捕获到要与替换函数一起使用的组中。我得到的最接近的是使用以下带有负前瞻的正则表达式,但这与所需的第3行不匹配:

">((?!.*?\[xcol]).*?)<br />

感谢任何帮助或建议。谢谢。

1 个答案:

答案 0 :(得分:3)

试试这个正则表达式:

">((?!\[xcol]).)*<br\s*/>

(简短)解释:

">               # match '">'
(                # start group 1
  (?!\[xcol]).   #   if '[xcol]' can't be seen ahead, match any character (except line breaks)
)                # end group 1
*                # repeat group 1 zero or more times
<br\s*/>         # match '<br />'

如果您还需要匹配.的换行符,请启用DOT-ALL(在(?s)之前添加.)或将.替换为类似[\s\S]

相关问题