在Java正则表达式中与多个模式重叠匹配

我遇到与此链接相同的问题

但有多种模式。 我的正则表达式如下:

Pattern word = Pattern.compile("([\w]+ [\d]+)|([\d]+ suite)|([\w]+ road)"); 

如果我的示例文本是,

XYZ Road 123 Suite

我的愿望输出是,

XYZ路123号

123套房

但我得到了

XYZ路123号

只要。

提前致谢!

您可以尝试使用正向前导断言的下面的正则表达式。

 (?=(\b\w+ Road \d+\b)|(\b\d+ suite\b)) 

DEMO

 String s = "XYZ Road 123 Suite"; Matcher m = Pattern.compile("(?i)(?=(\\b\\w+ Road \\d+\\b)|(\\b\\d+ suite))").matcher(s); while(m.find()) { if(m.group(1) != null) System.out.println(m.group(1)); if(m.group(2) != null) System.out.println(m.group(2)); } 

输出:

 XYZ Road 123 123 Suite 
 (?=(\b[\w]+ [\d]+))|(?=(\b[\d]+ suite))|(?=(\b[\w]+ road)) 

试试这个。看看demo.Grab捕获。

https://regex101.com/r/dU7oN5/16

使用positive lookahead以避免使用字符串。

也许这样的事情?

 Pattern p = Pattern.compile("([\\w ] Road) (\\d+) (Suite)"); Matcher m = p.matcher(input); if(m.find) { System.out.println(m.group(1) + " " + m.group(2)); System.out.println(m.group(2) + " " + m.group(3)); }