Regex忽略方括号中的文本

ttygqcqt  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(143)

我需要帮助创建这个正则表达式替换文本
下面是示例输入:

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

以下是我期待的示例输出:

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

谢谢你
我目前使用的正则表达式突出显示了写在方括号中以及方括号外的单词loves。我想忽略写在方括号里的爱这个词

  • 我正在使用这个regex -(?<=variable.*>.*)loves(?=.*<\/variable)
svdrlsy4

svdrlsy41#

这里最通用的解决方案和快速修复方法如下所示

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

放在loves后面的(?!(?<=\[[^][]*)[^][]*])负先行使其仅在loves子字符串不出现在方括号之间且之间没有其他方括号时才匹配。
参见this regex demo
请注意,多个.*部分会使正则表达式搜索变慢,即使在较长的单词(如gloves)中,loves部分也会匹配。要解决第一个问题,请使用否定字符类;要解决第二个问题,请使用单词边界:

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

参见this regex demo
如果variable标记中有其他标记,[^>]*[^<]*模式将无法工作,因此您必须依赖.*或像(?:(?!</?variable\b).)*这样的tempered greedy标记。

相关问题