在带有量词的Java正则表达式中,如何获得匹配的组?

在带有量词的Java正则表达式中,如何获得匹配的组?,java,regex,Java,Regex,我正在使用包含量词的Java正则表达式(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”)。正则表达式是在程序之外创建的,不过如果可能的话,我可以设计它们来解决这个问题。在多次匹配组时,不可能获得所有捕

我正在使用包含量词的Java正则表达式(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”)。正则表达式是在程序之外创建的,不过如果可能的话,我可以设计它们来解决这个问题。

在多次匹配组时,不可能获得所有捕获。你可以像这样重新设计你的正则表达式:

((?:[A-Z]+ ?){0,9}) ((?:\d+ ){0,9}) ((?:[A-Z]+ ?){0,9})
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
}

这将为您提供捕获“BC DEF”、“123456 7”和“XY Z”,然后您可以在空格上拆分这些捕获。

在多次匹配组时,不可能获得所有捕获。你可以像这样重新设计你的正则表达式:

((?:[A-Z]+ ?){0,9}) ((?:\d+ ){0,9}) ((?:[A-Z]+ ?){0,9})
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
}

这将为您提供捕获“BC DEF”、“123456 7”和“XY Z”,然后您可以在空格上拆分这些捕获。

如果在匹配的组上使用数量,则匹配的组将只返回最后一个匹配的。我的意思是:

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";
}
在您的情况下,另一种选择是这样做:

((?:[A-Z]+ ?){0,9}) ((?:\d+ ){0,9}) ((?:[A-Z]+ ?){0,9})
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
}

我意识到它的语义与正则表达式(按字母组和数字组的顺序)并不完全相同,但这只是一个开始。如果愿意,您可以自己执行这种状态检查。

如果在匹配的组上使用数量,匹配的组将只返回最后一个匹配的数量。我的意思是:

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";
}
在您的情况下,另一种选择是这样做:

((?:[A-Z]+ ?){0,9}) ((?:\d+ ){0,9}) ((?:[A-Z]+ ?){0,9})
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
}

我意识到它的语义与正则表达式(按字母组和数字组的顺序)并不完全相同,但这只是一个开始。如果愿意,您可以自己执行这种状态检查。

谢谢。我原以为我可能不得不这么做,但得到确认是很有用的。因为我已经将正则表达式解析为潜在的捕获组,所以我可以使用它们来解析更大的捕获组谢谢。我原以为我可能不得不这么做,但得到确认是很有用的。因为我已经将正则表达式解析为潜在的捕获组,所以我可以使用它们来解析更大的捕获