简体   繁体   中英

Getting overlapping matches with multiple patterns in Java regex

I have the same problem as in this link

but with multiple patterns. My regex is like:

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

If my sample text is,

XYZ Road 123 Suite

My desire output is,

XYZ Road 123

123 suite

But am getting

XYZ Road 123

only.

Thanks in advance!

(?=(\b[\w]+ [\d]+))|(?=(\b[\d]+ suite))|(?=(\b[\w]+ road))

Try this.See demo.Grab the captures.

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

Use positive lookahead to avoid string being consumed.

You could try the below regex which uses positive lookahead assertion.

(?=(\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));
}

Output:

XYZ Road 123
123 Suite

Something like this, maybe?

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM