更新:感谢您的所有好评!我尝试了许多不同的正则表达式模式,但不明白为什么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());
     }

10-06 13:37