Pattern/Matcher group()在Java中获取子字符串?

wuf*_*foo 10 java regex string match

更新:感谢所有伟大的回应!我尝试了许多不同的正则表达式模式,但不明白为什么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)
Run Code Online (Sandbox Code Playgroud)

hoa*_*oaz 10

你使用m.match()它试图匹配整个字符串,如果你将使用m.find()它,它将搜索里面的匹配,我也改进了你的正则表达式排除TZID前缀使用零宽度后看:

     Pattern p = Pattern.compile("(?<=TZID=)[^:]+"); //
     Matcher m = p.matcher ("DTSTART;TZID=America/Mexico_City:20121125T153000");
     if (m.find()) {
         System.out.println(m.group());
     }
Run Code Online (Sandbox Code Playgroud)


Ted*_*opp 6

这应该很好地工作:

Pattern p = Pattern.compile("TZID=(.*?):");
Matcher m = p.matcher(s);
if (m.find()) {
    String zone = m.group(1); // group count is 1-based
    . . .
}
Run Code Online (Sandbox Code Playgroud)

另一种正则表达式是"TZID=([^:]*)".我不确定哪个更快.