如何在特定字符串后获得更多组匹配?
How to get more group matches after specific string?
如何获取更多组正则表达式?
我想提取以下字符串的子字符串:
group g1 l1 l2 l3 g2 g3.l1
作为团体。输出应包括 g1、l1、l2、l3、g2 和 g3.l1。
我已经试过用这样的正则表达式得到这些:
group (\S+)\s(\S+)*
我的问题是,我可以使用组表达式 ( ) 得到不同的组,但我可以获得或多或少的这些子字符串。我的字符串也可能是这样的:group g1 g2.l1
您的模式从匹配 group
开始,然后使用 2 个捕获组。您只有 2 组,因为最后一组中的重复重复仅匹配非 whitespace char \S
并且不会匹配 whitespace char.
如果您将其更改为 (\s\S+)*
,您将重复捕获组,仅捕获最后一次重复的值。
你可能会做的是利用 \G
通过断言上一场比赛结束时的位置来获得重复比赛
(?:^group |\G(?!^))(\S+)(?:\s+|$)
在java
String regex = "(?:^group |\G(?!^))(\S+)(?:\s+|$)";
那将匹配
(?:
非捕获组
^group
匹配组和一个space处的字符串
|
或
\G(?!^)
断言位置在上一个匹配的末尾,而不是在字符串的开头
)
关闭非捕获组
(\S+)
在组 1 中捕获匹配 1+ 个非白色space 个字符
(?:\s+|$)
匹配 1+ whitespace 个字符或断言字符串结尾
例如
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
如果我们希望捕获那些用 space 分隔的字母数字,并单独捕获单词 group
,我们可以使用更改设计一个简单的表达式:
(group|another_group)|([^\s]+)
这里我们将简单地传递组,或者如果有的话,传递其他组:
(group|another_group)
然后我们收集除 spaces 之外的所有内容:
([^\s]+)
Demo
测试
import java.util.regex.Matcher;
import java.util.regex.Pattern;
final String regex = "(group|another_group)|([^\s]+)";
final String string = "group g1 l1 l2 l3 g2 g3.l1\n"
+ "another_group g1 l1 l2 l3 g2 g3.l1";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
正则表达式电路
jex.im 可视化正则表达式:
如何获取更多组正则表达式?
我想提取以下字符串的子字符串:
group g1 l1 l2 l3 g2 g3.l1
作为团体。输出应包括 g1、l1、l2、l3、g2 和 g3.l1。
我已经试过用这样的正则表达式得到这些:
group (\S+)\s(\S+)*
我的问题是,我可以使用组表达式 ( ) 得到不同的组,但我可以获得或多或少的这些子字符串。我的字符串也可能是这样的:group g1 g2.l1
您的模式从匹配 group
开始,然后使用 2 个捕获组。您只有 2 组,因为最后一组中的重复重复仅匹配非 whitespace char \S
并且不会匹配 whitespace char.
如果您将其更改为 (\s\S+)*
,您将重复捕获组,仅捕获最后一次重复的值。
你可能会做的是利用 \G
通过断言上一场比赛结束时的位置来获得重复比赛
(?:^group |\G(?!^))(\S+)(?:\s+|$)
在java
String regex = "(?:^group |\G(?!^))(\S+)(?:\s+|$)";
那将匹配
(?:
非捕获组^group
匹配组和一个space处的字符串|
或\G(?!^)
断言位置在上一个匹配的末尾,而不是在字符串的开头
)
关闭非捕获组(\S+)
在组 1 中捕获匹配 1+ 个非白色space 个字符(?:\s+|$)
匹配 1+ whitespace 个字符或断言字符串结尾
例如
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
如果我们希望捕获那些用 space 分隔的字母数字,并单独捕获单词 group
,我们可以使用更改设计一个简单的表达式:
(group|another_group)|([^\s]+)
这里我们将简单地传递组,或者如果有的话,传递其他组:
(group|another_group)
然后我们收集除 spaces 之外的所有内容:
([^\s]+)
Demo
测试
import java.util.regex.Matcher;
import java.util.regex.Pattern;
final String regex = "(group|another_group)|([^\s]+)";
final String string = "group g1 l1 l2 l3 g2 g3.l1\n"
+ "another_group g1 l1 l2 l3 g2 g3.l1";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
正则表达式电路
jex.im 可视化正则表达式: