/* package whatever; // don't place package name! */
import java.util.* ;
import java.lang.* ;
import java.io.* ;
import java.util.regex.Matcher ;
import java.util.regex.Pattern ;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
final String regex
= "(?<=1.*\\ [)\\ w+(?=\\ ])" ; final String string
= "I have a string line: 1aa[appleax]bb[appley]\n \n " + "I want to capture both applex and appley via regex and if there are more - I want to capture them too. I want words between brackets.\n \n "
+ "Here is a catch: I want to capture them only if they go after 1. If they go before 1 - I am not interested.\n \n "
+ "I've tried these 2 approaches (below) but they either give me applex or appley (greedy/lazy). But I want all of them. Does anybody know what I can use?\n \n "
+ "Approaches I've tried:\n \n "
+ "Catches only applex: 1.*?\\ [(\\ w*)\\ ]\n "
+ "Catches only appley: 1.*\\ [(\\ w*)\\ ]" ;
final Pattern pattern = Pattern.compile ( regex, Pattern.MULTILINE ) ;
final Matcher matcher = pattern.matcher ( string) ;
while ( matcher.find ( ) ) {
System .
out .
println ( "Full match: " + matcher.
group ( 0 ) ) ;
for ( int i = 1 ; i <= matcher.groupCount ( ) ; i++ ) {
System .
out .
println ( "Group " + i
+ ": " + matcher.
group ( i
) ) ; }
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwoKLyogTmFtZSBvZiB0aGUgY2xhc3MgaGFzIHRvIGJlICJNYWluIiBvbmx5IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMuICovCmNsYXNzIElkZW9uZQp7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKZmluYWwgU3RyaW5nIHJlZ2V4ID0gIig/PD0xLipcXFspXFx3Kyg/PVxcXSkiOwogICAgICAgIGZpbmFsIFN0cmluZyBzdHJpbmcgPSAiSSBoYXZlIGEgc3RyaW5nIGxpbmU6IDFhYVthcHBsZWF4XWJiW2FwcGxleV1cblxuIgoJICsgIkkgd2FudCB0byBjYXB0dXJlIGJvdGggYXBwbGV4IGFuZCBhcHBsZXkgdmlhIHJlZ2V4IGFuZCBpZiB0aGVyZSBhcmUgbW9yZSAtIEkgd2FudCB0byBjYXB0dXJlIHRoZW0gdG9vLiBJIHdhbnQgd29yZHMgYmV0d2VlbiBicmFja2V0cy5cblxuIgoJICsgIkhlcmUgaXMgYSBjYXRjaDogSSB3YW50IHRvIGNhcHR1cmUgdGhlbSBvbmx5IGlmIHRoZXkgZ28gYWZ0ZXIgMS4gSWYgdGhleSBnbyBiZWZvcmUgMSAtIEkgYW0gbm90IGludGVyZXN0ZWQuXG5cbiIKCSArICJJJ3ZlIHRyaWVkIHRoZXNlIDIgYXBwcm9hY2hlcyAoYmVsb3cpIGJ1dCB0aGV5IGVpdGhlciBnaXZlIG1lIGFwcGxleCBvciBhcHBsZXkgKGdyZWVkeS9sYXp5KS4gQnV0IEkgd2FudCBhbGwgb2YgdGhlbS4gRG9lcyBhbnlib2R5IGtub3cgd2hhdCBJIGNhbiB1c2U/XG5cbiIKCSArICJBcHByb2FjaGVzIEkndmUgdHJpZWQ6XG5cbiIKCSArICJDYXRjaGVzIG9ubHkgYXBwbGV4OiAxLio/XFxbKFxcdyopXFxdXG4iCgkgKyAiQ2F0Y2hlcyBvbmx5IGFwcGxleTogMS4qXFxbKFxcdyopXFxdIjsKICAgICAgICAKICAgICAgICBmaW5hbCBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUocmVnZXgsIFBhdHRlcm4uTVVMVElMSU5FKTsKICAgICAgICBmaW5hbCBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIoc3RyaW5nKTsKICAgICAgICAKICAgICAgICB3aGlsZSAobWF0Y2hlci5maW5kKCkpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGdWxsIG1hdGNoOiAiICsgbWF0Y2hlci5ncm91cCgwKSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtYXRjaGVyLmdyb3VwQ291bnQoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdyb3VwICIgKyBpICsgIjogIiArIG1hdGNoZXIuZ3JvdXAoaSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoJfQp9