如何将多个出现与我的正则表达式匹配?

时间:2018-06-03 23:46:09

标签: java regex

我有以下正则表达式:

cd [your app's main directory]
chown -R jack:jack .

以及以下文件结构:

(?s)Table.*?Seat (\\d).*?\\((\\d+).*?HOLE

目前我只得到了1和1537的比赛。我对我的正则表达式进行了不同的更改,并在不同的线程中搜索了解决方案,但看起来我无法解决这个问题。

我认为以下修改应该有效,但它没有:

Table xxx123
Seat 1: xxx (1537 xxx)
Seat 3: yyy (609 yyy)
Seat 5: zzz (485 zzz)
xxx123 HOLE

1 个答案:

答案 0 :(得分:2)

你快到了。您正在寻找的模式是\G

  

上一场比赛结束

然后将其与find()循环一起使用。在第一次调用find()时,\G匹配输入的开头。在后续调用中,它匹配上一个匹配的结束。

要阻止它与输入的开头匹配,请使用zero-width negative look-behind,然后将其与| OR operator结合使用以匹配输入开头的Table文本,并将其包围使用non-capturing group

(?:           start non-capturing group
   (?!<^)         not at beginning of input
   \G             match end of previous match
  |             OR
   Table          match "Table"
)             end non-capturing group

然后,您可以查找并匹配要捕获的内容。

.*?Seat (\d).*?\((\d+)

现在,您不希望实际匹配预告片(.*?HOLE),因为这会阻止\G继续下一次find()次迭代。相反,您只需使用zero-width positive look-ahead确保它就在那里。

(?=.*?HOLE)

演示

String input = "Table xxx123\n" +
               "Seat 1: xxx (1537 xxx)\n" +
               "Seat 3: yyy (609 yyy)\n" +
               "Seat 5: zzz (485 zzz)\n" +
               "xxx123 HOLE";

String regex = "(?s)(?:(?<!^)\\G|Table).*?Seat (\\d).*?\\((\\d+)(?=.*?HOLE)";

Matcher m = Pattern.compile(regex).matcher(input);
while (m.find())
    System.out.println(m.group(1) + " " + m.group(2));

输出

1 1537
3 609
5 485

请注意,这不是最佳解决方案,因为它会针对发现的每场比赛继续扫描预告片。