正则表达式删除除 XML 以外的所有内容

Regex to remove all except XML

我需要有关记事本++正则表达式的帮助,以匹配除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>

提前致谢!

这并不完美,但应该与您看起来非常简单且结构良好的输入一起工作。

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

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

查找内容(<(\w+)[^>]*>(?:(?!</?\b).|(?1))*</>)|.
替换为(?{1}\n:)
. 匹配换行符ON

正则表达式详细信息:

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

替换模式:

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