如何获得更多的正则表达式组?
我要提取以下字符串的子字符串:
group g1 l1 l2 l3 g2 g3.l1
分组。输出应包括g1,l1,l2,l3,g2和g3.l1。
我已经尝试使用正则表达式来获取这些内容:
group (\S+)\s(\S+)*
我的问题是,我可以通过组表达式()获得不同的组,但是我可以或多或少地获得这些子字符串。我的字符串也可能像这样:group g1 g2.l1
答案 0 :(得分:0)
您的模式以匹配的group
开始,然后使用2个捕获组。您只有2个组,因为最后一组中的重复仅重复匹配一个非空白char \S
,而不会匹配一个空白char。
如果将其更改为(\s\S+)*
,您将重复捕获组,仅捕获最后一次重复的值。
您可能要做的是利用\G
通过在上一场比赛的结尾声明位置来重复进行比赛
(?:^group |\G)(\S+)(?:\s+|$)
在Java
String regex = "(?:^group |\\G)(\\S+)(?:\\s+|$)";
这将匹配
(?:
非捕获组
^group
匹配组和字符串中的空格|
或\G
在上一场比赛结束时声明位置)
关闭非捕获组(\S+)
在组1中捕获,匹配1个以上非空格字符(?:\s+|$)
匹配1个以上空白字符或断言字符串的结尾{{3}}
答案 1 :(得分:0)
如果我们希望捕获那些用空格隔开的字母数字,并分别捕获单词group
,我们可以使用更改设计一个简单的表达式:
(group|another_group)|([^\s]+)
在这里,我们将简单地通过组,或者其他组:
(group|another_group)
然后我们使用以下方法收集除空格以外的所有内容:
([^\s]+)
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可视化正则表达式: