正则表达式忽略方括号中的文本

问题描述 投票:0回答:1

我需要帮助创建此正则表达式来替换文本

这是示例输入:

<variable class="loves">[loves] My dog loves dog food </variable>

这是我期望的示例输出:

<variable class="loves">[loves] My dog hates dog food </variable>

谢谢你

我当前使用的正则表达式突出显示方括号内以及方括号外的“loves”一词。我想忽略方括号里写的爱这个词

  • 我正在使用这个正则表达式 -
    (?<=variable.*>.*)loves(?=.*<\/variable)
regex
1个回答
0
投票

一个最通用的解决方案,而不是一个快速修复,看起来像这样

(?<=<variable.*>.*)loves(?!(?<=\[[^][]*)[^][]*])(?=.*</variable)

仅当

(?!(?<=\[[^][]*)[^][]*])
子字符串不出现在方括号之间且中间没有其他方括号时,放置在
loves
之后的
loves
负向先行才会匹配。

参见 这个正则表达式演示

请注意,多个

.*
部分将使正则表达式搜索速度变慢,并且
loves
部分即使在较长的单词(如
gloves
)内也会匹配。要解决第一个问题,请使用否定字符类,要解决第二个问题,请使用单词边界:

(?<=<variable[^>]*>[^>]*)\bloves\b(?!(?<=\[[^][]*)[^][]*])(?=[^<]*</variable)

请参阅 此正则表达式演示

如果

[^>]*
标签内有其他标签,则
[^<]*
variable
模式将不起作用,因此您必须依赖
.*
或像
(?:(?!</?variable\b).)*
这样的调和贪婪标记。

© www.soinside.com 2019 - 2024. All rights reserved.