Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何用正则表达式匹配多个事件?_Java_Regex - Fatal编程技术网

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));