正则表达式删除除 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
- 替换为内容 + 换行符
:
- 否则替换为空字符串
)
- 替换模式结束。
我需要有关记事本++正则表达式的帮助,以匹配除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
- 替换为内容 + 换行符:
- 否则替换为空字符串
)
- 替换模式结束。