UPDATE: Thanks for all the great responses! I tried many different regex patterns but didn't understand why m.matches() was not doing what I think it should be doing. When I switched to m.find() instead, as well as adjusting the regex pattern, I was able to get somewhere.
I'd like to match a pattern in a Java string and then extract the portion matched using a regex (like Perl's $& operator).
This is my source string "s": DTSTART;TZID=America/Mexico_City:20121125T153000
I want to extract the portion "America/Mexico_City".
I thought I could use Pattern and Matcher and then extract using m.group() but it's not working as I expected. I've tried monkeying with different regex strings and the only thing that seems to hit on m.matches() is ".*TZID.*"
which is pointless as it just returns the whole string. Could someone enlighten me?
Pattern p = Pattern.compile ("TZID*:"); // <- change to "TZID=([^:]*):"
Matcher m = p.matcher (s);
if (m.matches ()) // <- change to m.find()
Log.d (TAG, "looking at " + m.group ()); // <- change to m.group(1)
You are missing a dot before the asterisk. Your expression will match any number of uppercase
D
s.You should also add a capturing group unless you want to capture everything, including the
"TZID"
and the":"
Finally, you should use the right API to search the string, rather than attempting to match the string in its entirety.
This prints
This should work nicely:
An alternative regex is
"TZID=([^:]*)"
. I'm not sure which is faster.You are using the wrong pattern, try this:
.*?
will match anything in the beginning up toTZID=
, thenTZID=
will match and a group will begin and match everything up to:
, the group will close here and then:
will match and.*
will match the rest of the String, now you can get what you need ingroup(1)
Why not simply use split as:
You use
m.match()
that tries to match the whole string, if you will usem.find()
, it will search for the match inside, also I improved a bit your regexp to exclude TZID prefix using zero-width look behind: