模式/匹配组()来获取子在Java中?(Pattern/Matcher group() to obt

2019-07-04 17:41发布

更新:感谢所有伟大的答复! 我尝试了许多不同的正则表达式模式,但不明白为什么m.matches()并没有做什么,我认为它应该做的。 当我切换到m.find()来代替,以及调整正则表达式,我能够得到的地方。


我想匹配Java字符串的模式,然后提取使用正则表达式(如Perl的$&运营商)相匹配的部分。

这是我的源字符串“s”: DTSTART;TZID=America/Mexico_City:20121125T153000我想提取的部分“美洲/墨西哥城”。

我以为我可以使用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)

Answer 1:

您可以使用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());
     }


Answer 2:

这应该很好地工作:

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

备选的正则表达式是"TZID=([^:]*)" 我不知道这是更快。



Answer 3:

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

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)



Answer 4:

你缺少星号之前的一个点。 你的表达将匹配任何数量的大写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));
}

这版画

America/Mexico_City


Answer 5:

为什么不干脆用拆分为:

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


文章来源: Pattern/Matcher group() to obtain substring in Java?