java - 正则表达式基于具有嵌套尖括号的尖括号选择文本
问题描述
我想根据以下场景选择文本。我尝试了几个正则表达式,但仍然无法使用一个正则表达式涵盖所有场景。
设置 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
结果应该是两组1234和5678
add.sample.result <!ADD 1234 5678>
结果应该是两组add.sample.result和<NewName>
我试过的正则表达式
<([^>]*)>|(\S+)
这在 Set 1 和 Set 4 中运行良好,但在 Set 2 和 3 中,它捕获的组比需要的多。https://regexr.com/3si0v<(.*)>|(\S+)
这适用于第 2 组和第 4 组,但在第 1 组和第 3 组中给出错误结果。https://regexr.com/3si12
我需要正则表达式,它可以在所有集合中给出如上所述的预期结果。
解决方案
您可以使用
((?:<[^<>]*(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>[^<>]*)*>)+)|(\S+)
查看正则表达式演示
它要么匹配并捕获到 2 个组(?:<[^<>]*(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>[^<>]*)*>)+
或\S+
模式。
细节
(?:<[^<>]*(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>[^<>]*)*>)+
- 匹配 1 个或多个连续出现的<
- 一个<
[^<>]*
- 0+ 字符除了<
和>
(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>[^<>]*)*
- 0+ 个序列<[^<>]*(?:<[^<>]*>[^<>]*)*>
- 嵌套级别 1:<[^<>]*
-<
和 0+ 字符,而不是<
和>
(?:<[^<>]*>[^<>]*)*
- 嵌套级别 2:0+ 序列<
- 一个<
[^<>]*
- 0+ 字符除了<
和>
>
- 一个>
[^<>]*
- 0+ 字符除了<
和>
>
- 一个>
字符[^<>]*
- 0+ 字符除了<
和>
>
- 一个>
|
- 或者\S+
- 1+ 非空白字符。
推荐阅读
- sql - 重用已删除行的标识值
- ios - 如何处理 WKWebview 中的身份验证挑战?
- javascript - 返回 0 或 NaN 而不是实际结果的值
- django - 从 Django 自动创建数据库视图
- python - 什么时候需要 PYTHONPATH 中的 cwd?
- c# - 事件的C#实现
- visual-studio - 在 Visual Studio 代码中格式化液体(Shopify)代码
- node.js - 节点肥皂 ClientSSLSecurityPFX - 403 禁止
- php - codeigniter 中的电子邮件概念
- c# - 使用 C# 导出到 Excel 时,Excel 将日期列视为一般