我正在使用包含量词的Java Regexes(1.6)处理文本,我希望返回匹配组的数量和值。一个简单的例子是:
A BC DEF 1 23 456 7 XY Z
匹配:
([A-Z]+){0,9} (\d+){0,9} ([A-Z]+){0,9}
如何找到每次捕获的数量(此处为3 4 2)和值(“A”,“BC”,“DEF”,“1”,“23”,“456”,“7”, “XY”,“Z”)。正则表达式是在程序之外创建的,尽管我可以设计它们来解决这个问题。
答案 0 :(得分:3)
当不止一次匹配一个组时,无法获得所有捕获。您可以像这样重新设计正则表达式:
((?:[A-Z]+ ?){0,9}) ((?:\d+ ){0,9}) ((?:[A-Z]+ ?){0,9})
会给你捕获“A BC DEF”,“1 23 456 7”和“XY Z”,然后你可以在空格上分割。
答案 1 :(得分:1)
如果您在匹配的组中使用数量,匹配的组将仅返回最后一个匹配的组。我的意思是:
String s = "a ab abc";
Pattern p = Pattern.compile("(\w+){3}");
Matcher m = p.matcher(s);
if (m.match()) {
// m.group(1) will equal "abc";
}
在你的情况下,替代方案是做这样的事情:
String s = "A BC DEF 1 23 456 7 XY Z";
Pattern p = Pattern.comopile("([A-Z]+|\d+)");
Matcher m = p.matcher(s);
while (m.find()) {
// print the group
}
我意识到它与你的正则表达式没有完全相同的语义(按字母组和数字组的顺序),但它是一个开始。如果愿意,您可以自己实施这种状态检查。