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

アスタリスクの前にドットがありません。式は、任意の数の大文字に一致します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
于 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 に答える