gpt4 book ai didi

java - 正则表达式根据具有嵌套尖括号的尖括号选择文本

转载 作者:行者123 更新时间:2023-11-30 02:05:54 32 4
gpt4 key购买 nike

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

设置 1

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

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

设置 2

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

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

<XYZ.IDXX> notfound结果应为两组 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结果应为两组 12345678

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

我尝试过的正则表达式

  1. <([^>]*)>|(\S+)这在第 1 组和第 4 组中效果很好,但在第 2 组和第 3 组中,它捕获的组数超出了所需的组数。 https://regexr.com/3si0v

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

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

最佳答案

您可以使用

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

请参阅regex demo

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

详细信息

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

关于java - 正则表达式根据具有嵌套尖括号的尖括号选择文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51378111/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com