正则表达式基于具有嵌套尖括号的尖括号选择文本

时间:2018-07-17 09:42:48

标签: java regex

我想根据以下情况选择文本。我尝试了几次正则表达式,但仍然无法使用一个正则表达式涵盖所有情况。

设置1

<x> <y>结果应为两组

<Name> <NewName>的结果应为两组

设置2

sampletext <!PARSE<sampletext>><.value>的结果应该是两组 sampletext <!PARSE > <。value>

found <!PARSE<XYZ.ID>notfound>的结果应为两组 <!PARSE notfound>

<XYZ.IDXX> notfound的结果应为两组 未找到

notFoundString <!PARSE<XYZ.IDXX>notfound>的结果应为两组 <!PARSE notfound>

notFoundEmpty <!PARSE<XYZ.IDXX>>的结果应该是两组 <!PARSE >

设置3

<thread.end> <thread.start>的结果应为两组

<!MINUS <thread.end> <thread.start>> 1000的结果应为两组 <!MINUS > 1000

thread.duration <!DIVISION <!MINUS <thread.end> <thread.start>> 1000>的结果应为两组 thread.duration <!DIVISION <!MINUS > 1000>

设置4

1234 5678的结果应为两组 1234 5678

add.sample.result <!ADD 1234 5678>的结果应为两组 add.sample.result

我尝试过的正则表达式

  1. <([^>]*)>|(\S+)在设置1和4中工作正常,但是在设置2和3中,它捕获的组多于所需的组。 https://regexr.com/3si0v

  2. <(.*)>|(\S+)对于Set 2和4来说效果很好,但是在Set 1和3中给出了错误的结果。https://regexr.com/3si12

我需要正则表达式,该表达式可以在所有集合中提供如上所述的预期结果。

1 个答案:

答案 0 :(得分:2)

您可以使用

((?:<[^<>]*(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>[^<>]*)*>)+)|(\S+)

请参见regex demo

它可以匹配并捕获为两组(?:<[^<>]*(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>[^<>]*)*>)+\S+模式。

详细信息

  • (?:<[^<>]*(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>[^<>]*)*>)+-匹配1个或多个连续出现的
    • <-一个<
    • [^<>]*-除<>以外的0多个字符
    • (?:<[^<>]*(?:<[^<>]*>[^<>]*)*>[^<>]*)*-0个以上的序列
      • <[^<>]*(?:<[^<>]*>[^<>]*)*>-嵌套级别1:
      • <[^<>]*-<和0+个除<>以外的字符
      • (?:<[^<>]*>[^<>]*)*-嵌套级别2:0个以上的序列
        • <-一个<
        • [^<>]*-除<>以外的0多个字符
        • >-一个>
        • [^<>]*-除<>以外的0多个字符
      • >-一个>字符
      • [^<>]*-除<>以外的0多个字符
    • >-一个>
  • |-或
  • \S+-1个以上非空格字符。