我有一个简单的正则表达式,看起来像
([a-z]*)( +[a-z]="[0-9]")*
它适用于匹配
等模式test a="1" b="2" c="3"...
有没有办法在单独的匹配器组中捕获每个名称 - 值对(例如,a =“1”)?
正如在上面的例子中,我获得了(测试)的匹配器组,并且只有一个匹配器组用于3个名称 - 值对(即,最后一个,c =“3”)。我期待3个匹配组,每组1个。
答案 0 :(得分:8)
使用Matcher#find()
方法切换到下一组。
在循环中执行,例如:
Matcher matcher = pattern.matcher(test);
while (matcher.find()) {
//extract groups here
}
答案 1 :(得分:8)
我希望有3个匹配组,每组1个。
不,总共有两组。获得三组键值对的唯一方法是:
([a-z]*)( +[a-z]="[0-9]")( +[a-z]="[0-9]")( +[a-z]="[0-9]")
您可以匹配单个组中的所有键值对,然后使用单独的Pattern& Matcher就此:
import java.util.regex.*;
public class Main {
public static void main(String[] args) throws Exception {
String text = "test a=\"1\" b=\"2\" c=\"3\" bar d=\"4\" e=\"5\"";
System.out.println(text + "\n");
Matcher m1 = Pattern.compile("([a-z]*)((?:[ \t]+[a-z]=\"[0-9]\")*)").matcher(text);
while(m1.find()) {
System.out.println(m1.group(1));
Matcher m2 = Pattern.compile("([a-z])=\"([0-9])\"").matcher(m1.group(2));
while (m2.find()) {
System.out.println(" " + m2.group(1) + " -> " + m2.group(2));
}
}
}
}
产生:
test a="1" b="2" c="3" bar d="4" e="5"
test
a -> 1
b -> 2
c -> 3
bar
d -> 4
e -> 5
答案 2 :(得分:2)
不是我知道的。但如果您匹配\s+\w="\d"
,则可以多次致电find
并自行处理每场比赛。