Java 尝试在正则表达式中捕获多个组,同时跳过其他组
我试图创建一个正则表达式,它将在两个不同的示例文本上产生以下结果: 例1Java 尝试在正则表达式中捕获多个组,同时跳过其他组,java,android,regex,Java,Android,Regex,我试图创建一个正则表达式,它将在两个不同的示例文本上产生以下结果: 例1 示例文本1:“应用程序名称:人名” 捕获组1:“应用程序名称” 捕获组2:“人名” 例2 示例文本2:“应用程序名称(1个因素):人名” 捕获组1:“应用程序名称” 捕获组2:“人名” 我提出的正则表达式是:(.*)(\s\(.*))?:\s(.*) 但它似乎捕捉不正确,我不明白为什么 我正在Android上的Java中尝试这一点(我使用双斜杠在字符串中转义)我认为您需要的是: ([A-Za-z0-9\s]*)(\
- 示例文本1:“应用程序名称:人名”
- 捕获组1:“应用程序名称”
- 捕获组2:“人名”
- 示例文本2:“应用程序名称(1个因素):人名”
- 捕获组1:“应用程序名称”
- 捕获组2:“人名”
(.*)(\s\(.*))?:\s(.*)
但它似乎捕捉不正确,我不明白为什么
我正在Android上的Java中尝试这一点(我使用双斜杠在字符串中转义)我认为您需要的是:
([A-Za-z0-9\s]*)(\s\(.*\))?:\s(.*)
第一组中的
(.*)
贪婪地捕捉每个角色。您必须指定在(
)之前可以出现什么类型的字符。我使用regex101.com进行测试,它似乎适用于您提供的案例。我认为您需要的是:
([A-Za-z0-9\s]*)(\s\(.*\))?:\s(.*)
第一组中的
(.*)
贪婪地捕获每个字符。您必须指定(
)之前可以出现的字符类型。我使用regex101.com进行测试,它似乎适用于您提供的案例。只需执行的非捕获操作:
:
模式
([^:\n]+)\s*:\s*([^:\n]+)
请参阅演示。只需执行一个非捕获的
:
,如下所示:
模式
([^:\n]+)\s*:\s*([^:\n]+)
请参阅演示。您可以使用
^(.*?)(?:\s*\([^()]*\))?:\s*(.*)$
看
详细信息
-字符串的开头^
-捕获组1:除换行符以外的任何零个或多个字符,尽可能少(.*)
-一个可选的非捕获组,匹配1次或0次(?:\s*\([^()]*\)?
-0+空格\s*
-a\([^()]*\)
),除(
和(
之外的零个或多个字符,然后)
)
-冒号:
-0个或更多空格\s*
-捕获组2:除换行符以外的任何零个或多个字符,尽可能多(.*)
-字符串结束$
^(.*?)(?:\s*\([^()]*\))?:\s*(.*)$
看
详细信息
-字符串的开头^
-捕获组1:除换行符以外的任何零个或多个字符,尽可能少(.*)
-一个可选的非捕获组,匹配1次或0次(?:\s*\([^()]*\)?
-0+空格\s*
-a\([^()]*\)
),除(
和(
之外的零个或多个字符,然后)
)
-冒号:
-0个或更多空格\s*
-捕获组2:除换行符以外的任何零个或多个字符,尽可能多(.*)
-字符串结束$
*?
。否则*
将尝试匹配最大可能的匹配。这似乎解决了问题。(\s\(.*)?
是组2,无论它是否匹配某个内容(?
允许它是可选的)。因此,您的匹配在组1和组3中。您可以进行(\s\(.*))< /代码>非捕获组通过<代码>(?:\s\(**))?< /代码>,因此它不会成为组索引的一部分。也考虑制作<代码> *>代码>非贪婪(不情愿)。通过在其中添加*?
。否则*
将尝试匹配最大可能的匹配。这似乎解决了问题。您的回答确实适用于我的具体示例,尽管Pshemo的评论似乎提供了一个更通用的解决方案,它将适用于边缘情况,如t中包含其他字符或符号第一组:<代码> \W/<代码>覆盖代码> A-SZ-Z0-9/COD>。考虑简单地用<代码> \W/COD>替换它。您的响应确实适用于我的具体示例,尽管Pshemo的注释似乎提供了更一般的解决方案,如在第一组中包含的其他字符或符号一样,在边缘情况下工作。<代码> \W<代码>覆盖<代码> -AZ-Z0-9/COD>。考虑简单地用<代码> \W替换它。