0

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

提前致谢!

4

1 回答 1

2

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

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

在此处输入图像描述

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

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

在此处输入图像描述

正则表达式详细信息

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

更换模式

  • (?{1} - 如果第 1 组匹配:
    • $1\n- 用它的内容替换 + 换行符
    • :- 否则替换为空字符串
  • )- 替换模式结束。
于 2017-03-30T11:10:03.090 回答