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

时间:2012-12-07 17:03:25

标签: 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)

5 个答案:

答案 0 :(得分: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());
     }

答案 1 :(得分:6)

这应该很好用:

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

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

答案 2 :(得分:2)

您在星号前缺少一个点。您的表达式将匹配任意数量的大写D

Pattern p = Pattern.compile ("TZID[^:]*:");

您还应该添加捕获组,除非您要捕获所有内容,包括"TZID"":"

Pattern p = Pattern.compile ("TZID=([^:]*):");

最后,您应该使用正确的API来搜索字符串,而不是尝试完整匹配字符串。

Pattern p = Pattern.compile("TZID=([^:]*):");
Matcher m = p.matcher("DTSTART;TZID=America/Mexico_City:20121125T153000");
if (m.find()) {
    System.out.println(m.group(1));
}

prints

America/Mexico_City

答案 3 :(得分:2)

你使用了错误的模式,试试这个:

Pattern p = Pattern.compile(".*?TZID=([^:]+):.*");
Matcher m = p.matcher (s);
if (m.matches ())
    Log.d (TAG, "looking at " + m.group(1));

.*?会匹配从TZID=开始的所有内容,然后TZID=将匹配,并且群组将开始并匹配所有内容:,该群组将关闭这里然后:将匹配,.*将匹配字符串的其余部分,现在您可以在group(1)

中获得所需内容

答案 4 :(得分:1)

为什么不简单地使用split as:

  String origStr = "DTSTART;TZID=America/Mexico_City:20121125T153000";
  String str = origStr.split(":")[0].split("=")[1];