gpt4 book ai didi

java - 如何将多个匹配项与我的正则表达式匹配?

转载 作者:行者123 更新时间:2023-12-02 02:06:36 27 4
gpt4 key购买 nike

我有以下正则表达式:

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

以及以下文件结构:

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

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

我认为以下修改应该有效,但事实并非如此:

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

最佳答案

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

The end of the previous match

然后将其与 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

请注意,这不是最好的解决方案,因为它会继续扫描预告片以查找找到的每个匹配项。

关于java - 如何将多个匹配项与我的正则表达式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50671966/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com