更新:感谢您的所有好评!我尝试了许多不同的正则表达式模式,但不明白为什么m.matches()并未执行我认为应该做的事情。当我改用 m.find()时,同时调整了正则表达式模式,我还是可以找到某个地方。
我想匹配Java字符串中的模式,然后使用正则表达式(如Perl的$&运算符)提取匹配的部分。
这是我的源字符串“s”:DTSTART;TZID=America/Mexico_City:20121125T153000
我想提取“America/Mexico_City”部分。
我以为我可以使用Pattern和Matcher,然后使用m.group()进行提取,但是它没有按我预期的那样工作。我试过胡闹使用不同的正则表达式字符串,似乎唯一碰到m.matches()的是".*TZID.*"
,它毫无意义,因为它只返回整个字符串。有人可以启发我吗?
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)
最佳答案
您使用m.match()
尝试匹配整个字符串,如果您将使用m.find()
,它将在内部搜索匹配项,我还对您的regexp进行了一些改进,以使用零宽度的后缀来排除TZID前缀:
Pattern p = Pattern.compile("(?<=TZID=)[^:]+"); //
Matcher m = p.matcher ("DTSTART;TZID=America/Mexico_City:20121125T153000");
if (m.find()) {
System.out.println(m.group());
}