这是您的正则表达式:
(AAA\r\n)(ABC[0-9]\r\n){1,}
您的目标是捕获紧随其后的 所有 。如您在此Debuggex演示中所见,所有s确实都被匹配了(它们以黄色突出显示)。但是,由于只有“正在重复的内容”部分ABC#``AAA``ABC#
ABC[0-9]\r\n
被捕获(在括号内)及其量词,
{1,}
未被捕获,因此将导致 除最后一场 比赛 之外的 所有比赛 都 被丢弃。要获取它们,还必须捕获量词:
AAA\r\n((?:ABC[0-9]\r\n){1,})
我已将“正在重复的内容”部分(ABC[0-9]\r\n
)放入一个非捕获组。(AAA
由于您似乎不需要它,我也已停止捕获它。)
捕获的文本可以在换行符上进行拆分,并根据需要提供所有内容。
(请注意,\n
它本身在Debuggex中不起作用。它需要\r\n
这是一种解决方法。没有太多的正则表达式功能可以通过重复捕获(哪些捕获?)进行迭代。一种更普通的方法是遍历并 处理 找到的每个匹配项。这是来自Java的示例:
import java.util.regex.*;
public class RepeatingCaptureGroupsDemo {
public static void main(String[] args) {
String input = "I have a cat, but I like my dog better.";
Pattern p = Pattern.compile("(mouse|cat|dog|wolf|bear|human)");
Matcher m = p.matcher(input);
while (m.find()) {
System.out.println(m.group());
}
}
}
输出:
cat
dog
(摘自 http://ocpsoft.org/opensource/guide-to-regular-expressions-in-java- part-1/,大约减少了1/4)