首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换所有匹配的[.*] in ![CDATA[xxx]]而不替换CDATA

替换所有匹配的[.*] in ![CDATA[xxx]]而不替换CDATA
EN

Stack Overflow用户
提问于 2017-10-05 15:46:25
回答 1查看 1.1K关注 0票数 0

我试图删除字符串中的所有.*,但不删除![CDATAxxx]。我期待下面的结果

代码语言:javascript
复制
"""![CDATA[please remove[macro]]]"""
    .replaceAll("""(?<!CDATA)\[(?!CDATA).*\]""", "")

shouldBe

![CDATA[please remove]]

但结果是

![CDATA[please remove

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-05 15:59:44

正如我已经说过的,XML并不适合regex,但是如果您的输入总是类似于![CDATA[something [macro] something ... ]],即宏不包含空白(在大多数情况下这一点都没有意义),而且没有其他字符串看起来可能像宏,您可以这样做:

代码语言:javascript
复制
String replaced = "![CDATA[please remove[macro]]]".replaceAll("(?<!CDATA)\\[\\w+\\]", "" );

(?<!CDATA)\[\w+\]表达的分解

  • (?<!CDATA)是一个负面的展望,即比赛之前不能直接与CDATA。是为了防止没有宏匹配的CDATA元素)
  • \[\w+\]匹配被方括号包围的任何单词序列(\w等效于[a-zA-Z0-9_]),例如,它将匹配[please_remove],而不是[please remove]

使用该表达式,您将在![CDATA[ somthing [macro] somthing [another_macro]]] ... [macro_outside] ... [not a macro] ... ![CDATA[empty]]上获得以下匹配

  • [macro]
  • [another_macro]
  • [macro_outside]

但是,让我再次重申:只有当您知道输入字符串可能是什么样的,或者当输入字符串与您的需求不匹配时,它才能正常工作(如果您接受任何输入,那么肯定有不匹配的情况--因为XML是一种不规则的语言)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46589830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档