web-dev-qa-db-ja.com

Javaで部分文字列を取得するためのパターン/マッチャーgroup()?

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)
10
wufoo

文字列全体を照合しようとする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());
     }
10
hoaz

アスタリスクの前にドットがありません。式は、任意の数の大文字の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
2
dasblinkenlight

単純にsplitを次のように使用しないのはなぜですか。

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