Java 如何在特定字符串之后获得更多组匹配?

Java 如何在特定字符串之后获得更多组匹配?,java,regex,regex-lookarounds,regex-group,regex-greedy,Java,Regex,Regex Lookarounds,Regex Group,Regex Greedy,如何获得更多组的正则表达式 我想提取以下字符串的子字符串: group g1 l1 l2 l3 g2 g3.l1 作为团体。输出应包括g1、l1、l2、l3、g2和g3.l1 我已经试着用正则表达式得到了如下结果: group (\S+)\s(\S+)* 我的问题是,我可以用group表达式()得到不同的组,但我可以得到更多或更少的这些子字符串。我的字符串也可能是这样的:groupg1g2.l1您的模式从匹配的组开始,然后使用两个捕获组。因为最后一个组中的重复只会重复匹配非空白字符\S,而不

如何获得更多组的正则表达式

我想提取以下字符串的子字符串:

group g1 l1 l2 l3 g2 g3.l1
作为团体。输出应包括g1、l1、l2、l3、g2和g3.l1

我已经试着用正则表达式得到了如下结果:

group (\S+)\s(\S+)*

我的问题是,我可以用group表达式()得到不同的组,但我可以得到更多或更少的这些子字符串。我的字符串也可能是这样的:
groupg1g2.l1

您的模式从匹配的
组开始,然后使用两个捕获组。因为最后一个组中的重复只会重复匹配非空白字符
\S
,而不会匹配空白字符,所以只能得到2个组

如果将其更改为
(\s\s+)*
,则将重复捕获组,仅捕获最后一次重复的值

您可以使用
\G
通过在上一次匹配结束时声明位置来获得重复匹配

(?:^group |\G(?!^))(\S+)(?:\s+|$)
在爪哇

String regex = "(?:^group |\\G(?!^))(\\S+)(?:\\s+|$)";
那会匹配的

  • (?:
    非捕获组
    • ^group
      匹配组和字符串中字符串处的空格
    • |
    • \G(?!^)
      在上一个匹配的末尾而不是字符串的开头断言位置
  • 关闭非捕获组
  • (\S+)
    在组1中捕获匹配的1+非空白字符
  • (?:\s+|$)
    匹配1+空格字符或断言字符串结尾
|

比如说

String regex = "(?:^group |\\G(?!^))(\\S+)(?:\\s+|$)";
String string = "group g1 l1 l2 l3 g2 g3.l1";

Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println(matcher.group(1));
}
结果

g1
l1
l2
l3
g2
g3.l1

您的模式以匹配
组开始,然后使用2个捕获组。因为最后一个组中的重复只会重复匹配非空白字符
\S
,而不会匹配空白字符,所以只能得到2个组

如果将其更改为
(\s\s+)*
,则将重复捕获组,仅捕获最后一次重复的值

您可以使用
\G
通过在上一次匹配结束时声明位置来获得重复匹配

(?:^group |\G(?!^))(\S+)(?:\s+|$)
在爪哇

String regex = "(?:^group |\\G(?!^))(\\S+)(?:\\s+|$)";
那会匹配的

  • (?:
    非捕获组
    • ^group
      匹配组和字符串中字符串处的空格
    • |
    • \G(?!^)
      在上一个匹配的末尾而不是字符串的开头断言位置
  • 关闭非捕获组
  • (\S+)
    在组1中捕获匹配的1+非空白字符
  • (?:\s+|$)
    匹配1+空格字符或断言字符串结尾
|

比如说

String regex = "(?:^group |\\G(?!^))(\\S+)(?:\\s+|$)";
String string = "group g1 l1 l2 l3 g2 g3.l1";

Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println(matcher.group(1));
}
结果

g1
l1
l2
l3
g2
g3.l1

如果我们希望捕获那些用空格分隔的字母数字,并分别捕获单词
group
,我们可以使用更改设计一个简单的表达式:

(group|another_group)|([^\s]+)
在这里,我们将简单地传递组,或者如果有的话,传递其他组:

(group|another_group)
然后,我们使用以下方法收集所有内容(不包括空间):

([^\s]+)
试验
import java.util.regex.Matcher;
导入java.util.regex.Pattern;
最后一个字符串regex=“(组|另一个组)|”([^\\s]+)”;
final String String=“组g1 l1 l2 l3 g2 g3.l1\n”
+“另一组g1 l1 l2 l3 g2 g3.l1”;
最终模式=Pattern.compile(regex,Pattern.MULTILINE);
final Matcher Matcher=pattern.Matcher(字符串);
while(matcher.find()){
System.out.println(“完全匹配:+matcher.group(0));

对于(int i=1;i如果我们希望捕获那些用空格分隔的字母数字,并分别捕获单词
group
,我们可以使用更改设计一个简单的表达式:

(group|another_group)|([^\s]+)
在这里,我们将简单地传递组,或者如果有的话,传递其他组:

(group|another_group)
然后,我们使用以下方法收集所有内容(不包括空间):

([^\s]+)
试验
import java.util.regex.Matcher;
导入java.util.regex.Pattern;
最后一个字符串regex=“(组|另一个组)|”([^\\s]+)”;
final String String=“组g1 l1 l2 l3 g2 g3.l1\n”
+“另一组g1 l1 l2 l3 g2 g3.l1”;
最终模式=Pattern.compile(regex,Pattern.MULTILINE);
final Matcher Matcher=pattern.Matcher(字符串);
while(matcher.find()){
System.out.println(“完全匹配:+matcher.group(0));

对于(int i=1;我能不能请你提供一个你想要正则表达式通过的字符串和你想要的输出的实际文本示例?我对你的问题理解不多。你能提供一个你想要正则表达式通过的字符串和你想要的输出的实际文本示例吗?我对你的问题理解不多。请注意,你的模式也将匹配en
不存在,因为替换将匹配任一组或不匹配空白字符。请注意,当
不存在时,您的模式也将匹配,因为替换将匹配任一组或不匹配空白字符。可以在不同组中提取它们吗?我想获得f第一组为第1组,其余为第1组2@Sony您可以这样做:
^group(\S+)(?:\S+*)
,也可以将group 2拆分到一个空间中。或者将group 2拆分为单独的group
(?:^group(\S+)\G(?!^))\S(\S+)
可以在不同的组中提取这些结果吗?我希望第一个结果作为组1,其他结果作为组2@Sony您可以这样做:
^group(\S+)(?:\S+*)
,也可以将group 2拆分到一个空间中。或者将group 2拆分为单独的group(\code>)(?:^group(\S+)\G(?!^))\S(\S+)