【问题标题】:Regex to remove all except XML正则表达式删除除 XML 之外的所有内容
【发布时间】:2017-08-24 06:14:08
【问题描述】:

我需要一个用于 notepad++ 的正则表达式来匹配除 XML 之外的所有内容

我正在使用的正则表达式: (!?\<.*\>)

示例代码:

[20173003] This text is what I want to delete [<Person><Name>Foo</Name><Surname>Bar</Surname></Person>], and this text too.
[20173003] This is another text to delete [<Person><Name>Bar</Name><Surname>Foo</Surname></Person>]
[20173003] This text too... [<Person><Name>Lorem</Name><Surname>Ipsum</Surname></Person>], delete me!
[20173003] But things like this make the regex to fail < [<Person><Name>Lorem</Name><Surname>Ipsum</Surname></Person>], or this>

预期结果:

<Person><Name>Foo</Name><Surname>Bar</Surname></Person>
<Person><Name>Bar</Name><Surname>Foo</Surname></Person>
<Person><Name>Lorem</Name><Surname>Ipsum</Surname></Person>
<Person><Name>Lorem</Name><Surname>Ipsum</Surname></Person>

提前致谢!

【问题讨论】:

  • 能否提供预期的结果(尤其是最后一行)?
  • 我不确定你想对你的输入文本做什么!但最后一个输入行失败是因为在您的模式中使用了.,将其更改为[^&lt;&gt;] 以不在其他标签名称中包含标签!并在* 之后添加? 以在第一次&gt; 会议中停止捕获。
  • 我更新了预期的结果。谢谢:)
  • 我不知道你想用 (!?\&lt;.*\&gt;) 做什么。这将捕获一个可选的感叹号!,后跟一个开放的分括号,尽可能多的字符,以及一个封闭的分括号。

标签: regex xml notepad++ negate


【解决方案1】:

这并不完美,但应该适用于看起来非常简单且结构良好的输入。

如果您只需要处理一个未嵌套的 &lt;Person&gt; 标记,您可以使用简单的 (&lt;Person&gt;.*?&lt;/Person&gt;)|. 正则表达式(它将匹配并捕获到组 1 任何 &lt;Person&gt; 标记,并将匹配任何其他字符)并替换为条件替换模式(?{1}$1\n:)(这将重新插入Person标签并在其后加上换行符,或者将匹配项替换为空字符串):

为了使其更通用,您可以使用基于递归的 Boost 正则表达式和适当的条件替换模式来捕获开始和相应的结束 XML 标记:

查找内容:     (&lt;(\w+)[^&gt;]*&gt;(?:(?!&lt;/?\2\b).|(?1))*&lt;/\2&gt;)|.
替换为(?{1}$1\n:)
. 匹配换行符:@987654333 @

正则表达式详细信息

  • (&lt;(\w+)[^&gt;]*&gt;(?:(?!&lt;/?\2\b).|(?1))*&lt;/\2&gt;) - 捕获组 1(稍后将使用 (?1) 子路由调用递归)匹配
    • &lt;(\w+)[^&gt;]*&gt; - 任何名称被捕获到第 2 组的开始标签
    • (?:(?!&lt;/?\2\b).|(?1))* - 零次或多次出现:
      • (?!&lt;/?\2\b). - 任何字符 (.) 不以 &lt;/ + 标记名称作为整个单词的序列开头,前面带有可选的 /
      • | - 或
      • (?1) - 整个 Group 1 子模式被递归(重复)
    • &lt;/\2&gt; - 对应的结束标签
  • | - 或
  • . - 任何单个字符。

替换模式

  • (?{1} - 如果第 1 组匹配:
    • $1\n - 替换为内容+换行符
    • : - 否则替换为空字符串
  • ) - 替换模式结束。

【讨论】:

  • 优秀的解决方案,很好的解释。
  • 我添加了一个简化版本,以防您只需要处理 1 个未嵌套的 &lt;Person&gt; 标签。
猜你喜欢
  • 1970-01-01
  • 2018-05-26
  • 2019-04-15
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多