3

我正在使用 TextWrangler grep 对多个文件执行查找/替换,并且遇到了我需要执行的最后一个查找/替换的墙。我需要匹配一行中 a">的第一个实例之间的任何文本,<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>  

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

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

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

任何帮助或建议表示赞赏。谢谢你。

4

1 回答 1

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]

于 2011-01-05T19:54:26.490 回答