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
见现场演示。
这通过应用两个前瞻来工作:
- 第一次向前看
(?=(?:(?:[^"]*"){2})*[^"]*"[^"]*$)
需要在剩余的输入中有奇数个引号字符,这反过来意味着匹配在引号内 - 另一个前瞻
(?=[^<>]*>)
要求下一个尖括号是右括号,这反过来意味着匹配在尖括号对内
这不是防弹的,例如它不适合在引号内的右尖括号,但即使这样也可以通过更复杂的前瞻来处理,在匹配尖括号时应用与第一次前瞻类似的逻辑......留给读者的练习。
推荐阅读
- linux - 哪个 Azure AD 版本在使用 PowerShell 6.3 的基于 Linux 的 Azure 部署脚本中有效(应该安装)
- javascript - 错误:验证 app.json 中的字段时出现问题。请参阅 https://docs.expo.io/workflow/configuration/• 不应有附加属性“nodeModulesPath”
- javascript - 粘贴文本的 React Quill 字符限制
- c++ - 在 Qt5 的 QWidget 中添加一个新按钮
- reactjs - 内容丰富的富文本呈现为 P 标记的无序列表
- python - if 和 elif 都包含在 apply(lambda x:
- minecraft-forge - Minecraft Forge - gradlew - 无效的修补程序依赖
- javascript - 如何选择多个用JS实时生成的项目?
- java - 应用程序在 upload_image.setImageURI(im) 上崩溃;
- android - 谷歌 OAuth 安卓客户端