Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试在正则表达式中捕获多个组,同时跳过其他组_Java_Android_Regex - Fatal编程技术网

Java 尝试在正则表达式中捕获多个组,同时跳过其他组

Java 尝试在正则表达式中捕获多个组,同时跳过其他组,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:“应用程序名称:人名”
  • 捕获组1:“应用程序名称”
  • 捕获组2:“人名”
例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:除换行符以外的任何零个或多个字符,尽可能少
  • (?:\s*\([^()]*\)?
    -一个可选的非捕获组,匹配1次或0次
    • \s*
      -0+空格
    • \([^()]*\)
      -a
      ),除
      之外的零个或多个字符,然后
  • -冒号
  • \s*
    -0个或更多空格
  • (.*)
    -捕获组2:除换行符以外的任何零个或多个字符,尽可能多
  • $
    -字符串结束
您可以使用

^(.*?)(?:\s*\([^()]*\))?:\s*(.*)$

详细信息

  • ^
    -字符串的开头
  • (.*)
    -捕获组1:除换行符以外的任何零个或多个字符,尽可能少
  • (?:\s*\([^()]*\)?
    -一个可选的非捕获组,匹配1次或0次
    • \s*
      -0+空格
    • \([^()]*\)
      -a
      ),除
      之外的零个或多个字符,然后
  • -冒号
  • \s*
    -0个或更多空格
  • (.*)
    -捕获组2:除换行符以外的任何零个或多个字符,尽可能多
  • $
    -字符串结束

<代码>(\\(**))/<代码>不管组是否匹配(<代码> ./COD>让它是可选的)。所以您的匹配在组1和组3中。可以通过<代码>(<:\\(**))< <代码> >非代码组>(<:\ \)],因此它不会成为组索引的一部分。还考虑制作<代码> *>代码>非贪婪。(不情愿)在其中添加
*?
。否则
*
将尝试匹配最大可能的匹配。这似乎解决了问题。
(\s\(.*)?
是组2,无论它是否匹配某个内容(
允许它是可选的)。因此,您的匹配在组1和组3中。您可以进行
(\s\(.*))< /代码>非捕获组通过<代码>(?:\s\(**))?< /代码>,因此它不会成为组索引的一部分。也考虑制作<代码> *>代码>非贪婪(不情愿)。通过在其中添加
*?
。否则
*
将尝试匹配最大可能的匹配。这似乎解决了问题。您的回答确实适用于我的具体示例,尽管Pshemo的评论似乎提供了一个更通用的解决方案,它将适用于边缘情况,如t中包含其他字符或符号第一组:<代码> \W/<代码>覆盖代码> A-SZ-Z0-9/COD>。考虑简单地用<代码> \W/COD>替换它。您的响应确实适用于我的具体示例,尽管Pshemo的注释似乎提供了更一般的解决方案,如在第一组中包含的其他字符或符号一样,在边缘情况下工作。<代码> \W<代码>覆盖<代码> -AZ-Z0-9/COD>。考虑简单地用<代码> \W替换它。