12

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

5 回答 5

13

您使用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());
     }
于 2012-12-07T17:21:56.223 回答
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=([^:]*)". 我不确定哪个更快。

于 2012-12-07T17:11:58.770 回答
2

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

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));
}

打印

America/Mexico_City
于 2012-12-07T17:06:22.957 回答
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)

于 2012-12-07T17:09:07.387 回答
1

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

  String origStr = "DTSTART;TZID=America/Mexico_City:20121125T153000";
  String str = origStr.split(":")[0].split("=")[1];
于 2012-12-07T17:14:36.660 回答