首页 > 解决方案 > 如何使用正则表达式替换 <> 之间的特定字符串

问题描述

谁能告诉我如何使用正则表达式完成以下任务?

仅当两者都在ABCDEFABC<>""

原始字符串:

<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 文本。

标签: regex

解决方案


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

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

现场演示

这通过应用两个前瞻来工作:

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

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


推荐阅读