有人能告诉我如何使用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})*[^"]*"[^"]*$)
要求在剩余的输入中有奇数个引号字符,这反过来意味着匹配在引号内 - 另一个前瞻
(?=[^<>]*>)
要求下一个角括号是闭合括号,这反过来意味着匹配在一对角括号内
这不是防弹的,例如,它不适合引号内的右尖括号,但即使这样,也可以通过更复杂的前瞻来处理,在匹配尖括号时应用与第一个前瞻类似的逻辑。。。留给读者的一篇文章。