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

发布于 2024-10-10 09:05:36 字数 920 浏览 7 评论 0原文

我正在使用 TextWrangler grep 对多个文件执行查找/替换,但我需要执行的最后一个查找/替换却遇到了麻烦。我需要匹配行中 ">
的第一个实例之间的任何文本,但匹配不能包含字符序列 [xcol] 需要固定长度

正则表达式风格与 Perl 兼容 (PCRE),因此后向搜索

<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

第二行不匹配
第三行匹配 ">Hello World

第 4 行 不匹配

">
之间的文本将被捕获在一个组中,以便与我得到的最接近的是使用以下带有负向预测的正则表达式,但这与所需的第三行不匹配:

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

感谢任何帮助或建议。

I'm using TextWrangler grep to perform find/replace on multiple files and have run into a wall with the last find/replace I need to perform. I need to match any text between "> and the first instance of a <br /> in a line but the match cannot contain the character sequence [xcol]. The regex flavor is Perl-Compatible (PCRE) so lookbehind needs to be fixed-length.

Example Text to Search:

<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>  

Desired behavior of regex:
1st Line match ">FooBar<br />
2nd Line no match
3rd Line match ">Hello World<br />
4th Line no match

The text between "> and the <br /> will be captured in a group to be used with the replace function. The closest I got was using the following regex with negative lookahead, but this will not match the 3rd line as desired:

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

Any help or advice is appreciated. Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你在看孤独的风景 2024-10-17 09:05:36

试试这个正则表达式:(

">((?!\[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) code>.) 或将 . 替换为 [\s\S]

Try this regex:

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

A (short) explanation:

">               # 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 />'

If you need to match line breaks for . as well, either enable DOT-ALL (add (?s) before the .) or replace the . with something like [\s\S]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文