更新:感谢所有伟大的答复! 我尝试了许多不同的正则表达式模式,但不明白为什么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)
您可以使用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());
}
这应该很好地工作:
Pattern p = Pattern.compile("TZID=(.*?):");
Matcher m = p.matcher(s);
if (m.find()) {
String zone = m.group(1); // group count is 1-based
. . .
}
备选的正则表达式是"TZID=([^:]*)"
我不知道这是更快。
您使用了错误的模式,试试这个:
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)
你缺少星号之前的一个点。 你的表达将匹配任何数量的大写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
为什么不干脆用拆分为:
String origStr = "DTSTART;TZID=America/Mexico_City:20121125T153000";
String str = origStr.split(":")[0].split("=")[1];