Java 如何用正则表达式匹配多个事件?
我有以下正则表达式:Java 如何用正则表达式匹配多个事件?,java,regex,Java,Regex,我有以下正则表达式: (?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)Tabl
(?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
你快到了。您正在寻找的模式是: 上一场比赛的结束 然后与循环一起使用。在第一次调用
find()
时,\G
匹配输入的开头。在随后的调用中,它与上一个匹配的结尾相匹配
为了防止它与输入开头匹配,可以使用a,然后将其与a组合,以匹配输入开头的表格
文本,并用a将其环绕
现在,您不希望实际匹配预告片(*?HOLE
),因为这将阻止\G
继续下一次find()
迭代。相反,您只需使用
演示
请注意,这不是最好的解决方案,因为它会不断扫描找到的每个匹配项的预告片。您就快到了。您正在寻找的模式是: 上一场比赛的结束 然后与循环一起使用。在第一次调用
find()
时,\G
匹配输入的开头。在随后的调用中,它与上一个匹配的结尾相匹配
为了防止它与输入开头匹配,可以使用a,然后将其与a组合,以匹配输入开头的表格
文本,并用a将其环绕
现在,您不希望实际匹配预告片(*?HOLE
),因为这将阻止\G
继续下一次find()
迭代。相反,您只需使用
演示
请注意,这不是最好的解决方案,因为它会不断扫描找到的每个匹配项的预告片。您能详细说明一下吗?你想精确匹配什么?您希望使用哪种编程语言来实现此目的?我还希望匹配数字3、609、5和485。编程语言是Java。是否需要确保带有数字的行包含在
表…
和孔之间?换句话说,如果没有其他方法,我可以将特定部分作为子字符串。但我更愿意用正则表达式来解决这个问题。你能详细说明一下吗?你想精确匹配什么?您希望使用哪种编程语言来实现此目的?我还希望匹配数字3、609、5和485。编程语言是Java。是否需要确保带有数字的行包含在表…
和孔之间?换句话说,如果没有其他方法,我可以将特定部分作为子字符串。但我更愿意用正则表达式来解决这个问题。
(?: 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)
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));