我有以下正则表达式:
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
答案 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
请注意,这不是最佳解决方案,因为它会针对发现的每场比赛继续扫描预告片。