PDATE:すべての素晴らしい回答をありがとう!さまざまな正規表現パターンを試しましたが、m.matches()が本来あるべきことを実行していない理由がわかりませんでした。代わりにm.find()に切り替えたとき、正規表現パターンを調整するだけでなく、どこかに到達することができました。
Java文字列のパターンに一致させてから、正規表現(Perlの$&演算子など)を使用して一致した部分を抽出したいと思います。
これは私のソース文字列 "s"です:DTSTART;TZID=America/Mexico_City:20121125T153000
「America/Mexico_City」の部分を抽出したい。
パターンとマッチャーを使用してから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());
}
アスタリスクの前にドットがありません。式は、任意の数の大文字のD
sに一致します。
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
単純にsplitを次のように使用しないのはなぜですか。
String origStr = "DTSTART;TZID=America/Mexico_City:20121125T153000";
String str = origStr.split(":")[0].split("=")[1];