我想根据以下情况选择文本。我尝试了几次正则表达式,但仍然无法使用一个正则表达式涵盖所有情况。
设置1
<x> <y>
结果应为两组
<Name> <NewName>
的结果应为两组
设置2
sampletext <!PARSE<sampletext>><.value>
的结果应该是两组 sampletext 和 <!PARSE
found <!PARSE<XYZ.ID>notfound>
的结果应为两组
<XYZ.IDXX> notfound
的结果应为两组
notFoundString <!PARSE<XYZ.IDXX>notfound>
的结果应为两组
notFoundEmpty <!PARSE<XYZ.IDXX>>
的结果应该是两组
设置3
<thread.end> <thread.start>
的结果应为两组
<!MINUS <thread.end> <thread.start>> 1000
的结果应为两组 <!MINUS
thread.duration <!DIVISION <!MINUS <thread.end> <thread.start>> 1000>
的结果应为两组 thread.duration 和 <!DIVISION <!MINUS
设置4
1234 5678
的结果应为两组 1234 和 5678
add.sample.result <!ADD 1234 5678>
的结果应为两组 add.sample.result 和
我尝试过的正则表达式
<([^>]*)>|(\S+)
在设置1和4中工作正常,但是在设置2和3中,它捕获的组多于所需的组。 https://regexr.com/3si0v
<(.*)>|(\S+)
对于Set 2和4来说效果很好,但是在Set 1和3中给出了错误的结果。https://regexr.com/3si12
我需要正则表达式,该表达式可以在所有集合中提供如上所述的预期结果。
答案 0 :(得分:2)
您可以使用
((?:<[^<>]*(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>[^<>]*)*>)+)|(\S+)
请参见regex demo
它可以匹配并捕获为两组(?:<[^<>]*(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>[^<>]*)*>)+
或\S+
模式。
详细信息
(?:<[^<>]*(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>[^<>]*)*>)+
-匹配1个或多个连续出现的
<
-一个<
[^<>]*
-除<
和>
以外的0多个字符(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>[^<>]*)*
-0个以上的序列
<[^<>]*(?:<[^<>]*>[^<>]*)*>
-嵌套级别1:<[^<>]*
-<
和0+个除<
和>
以外的字符(?:<[^<>]*>[^<>]*)*
-嵌套级别2:0个以上的序列
<
-一个<
[^<>]*
-除<
和>
以外的0多个字符>
-一个>
[^<>]*
-除<
和>
以外的0多个字符>
-一个>
字符[^<>]*
-除<
和>
以外的0多个字符>
-一个>
|
-或\S+
-1个以上非空格字符。