首页 > 解决方案 > 正则表达式基于具有嵌套尖括号的尖括号选择文本

问题描述

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

设置 1

<x> <y> 结果应该是两组<x><y>

<Name> <NewName>结果应该是两组<Name><NewName>

设置 2

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

found <!PARSE<XYZ.ID>notfound>结果应该是两组<found><!PARSE<XYZ.ID>notfound>

<XYZ.IDXX> notfound结果应该是两组<XYZ.IDXX>notfound

notFoundString <!PARSE<XYZ.IDXX>notfound>结果应该是两组<notFoundString><!PARSE<XYZ.IDXX>notfound>

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

设置 3

<thread.end> <thread.start>结果应该是两组<thread.end><thread.start>

<!MINUS <thread.end> <thread.start>> 1000结果应该是两组<!MINUS <thread.end> <thread.start>>1000

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

设置 4

1234 5678结果应该是两组12345678

add.sample.result <!ADD 1234 5678>结果应该是两组add.sample.result<NewName>

我试过的正则表达式

  1. <([^>]*)>|(\S+)这在 Set 1 和 Set 4 中运行良好,但在 Set 2 和 3 中,它捕获的组比需要的多。https://regexr.com/3si0v

  2. <(.*)>|(\S+) 这适用于第 2 组和第 4 组,但在第 1 组和第 3 组中给出错误结果。https://regexr.com/3si12

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

标签: javaregex

解决方案


您可以使用

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

查看正则表达式演示

它要么匹配并捕获到 2 个组(?:<[^<>]*(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>[^<>]*)*>)+\S+模式。

细节

  • (?:<[^<>]*(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>[^<>]*)*>)+- 匹配 1 个或多个连续出现的
    • <- 一个<
    • [^<>]*- 0+ 字符除了<>
    • (?:<[^<>]*(?:<[^<>]*>[^<>]*)*>[^<>]*)*- 0+ 个序列
      • <[^<>]*(?:<[^<>]*>[^<>]*)*>- 嵌套级别 1:
      • <[^<>]*-<和 0+ 字符,而不是<>
      • (?:<[^<>]*>[^<>]*)* - 嵌套级别 2:0+ 序列
        • <- 一个<
        • [^<>]*- 0+ 字符除了<>
        • >- 一个>
        • [^<>]*- 0+ 字符除了<>
      • > - 一个>字符
      • [^<>]*- 0+ 字符除了<>
    • >- 一个>
  • |- 或者
  • \S+- 1+ 非空白字符。

推荐阅读