如何使用正则表达式替换<>之间的特定字符串



有人能告诉我如何使用regex完成以下任务吗?

仅当ABC<>""内时,才用DEF替换所有ABC

原始字符串:

<tagA nameABC1="attr1ABCx xyzABC" name2="attABCa"> outside"ABC"xyz</tagA>
<tagB nameABC2="attr2ABCx cccABC" name3="testABCb"> outside_"ABC"</tagB>

替换后所需的字符串:

<tagA nameABC1="attr1DEFx xyzDEF" name2="attDEFa"> outside"ABC"xyz</tagA>
<tagB nameABC2="attr2DEFx cccDEF" name3="testDEFb"> outside_"ABC"</tagB>

编辑时间:谢谢大家。我决定使用HTML解析器库jsoup来正确处理所有HTML文本。

假设输入格式正确(没有悬空引号或括号):

Search: ABC(?=(?:(?:[^"]*"){2})*[^"]*"[^"]*$)(?=[^<>]*>)
Replace: DEF

观看现场演示。

这是通过应用两种外观ahead来实现的:

  • 第一个前瞻(?=(?:(?:[^"]*"){2})*[^"]*"[^"]*$)要求在剩余的输入中有奇数个引号字符,这反过来意味着匹配在引号内
  • 另一个前瞻(?=[^<>]*>)要求下一个角括号是闭合括号,这反过来意味着匹配在一对角括号内

这不是防弹的,例如,它不适合引号内的右尖括号,但即使这样,也可以通过更复杂的前瞻来处理,在匹配尖括号时应用与第一个前瞻类似的逻辑。。。留给读者的一篇文章。

最新更新