1. ホーム
  2. regex

[解決済み】Regexオプションのキャプチャグループ?

2022-03-17 16:17:04

質問

何時間も検索した後、私はこの質問をすることにしました。なぜこの正規表現では ^(dog).+?(cat)? は、私が考えているように動作するのでしょうか(つまり、最初の犬と猫があればそれを捕捉する)?私はここで何を見逃しているのでしょうか?

dog, cat
dog, dog, cat
dog, dog, dog

解決方法は?

を取得できないのは、オプションの cat の後に、不本意ながら .+? は、オプションかつ非固定的であるということです:エンジンはそのマッチングを強制されません。 cat の末尾として扱われます。 .+? シーケンスになります。

猫を文字列の末尾に固定する場合、すなわち ^(dog).+?(cat)?$ を使えば、マッチするはずですが。

Pattern p = Pattern.compile("^(dog).+?(cat)?$");
for (String s : new String[] {"dog, cat", "dog, dog, cat", "dog, dog, dog"}) {
    Matcher m = p.matcher(s);
    if (m.find()) {
        System.out.println(m.group(1)+" "+m.group(2));
    }
}

これは、印刷する( デモ1 )

dog cat
dog cat
dog null

万が一、猫の後に何かあった時の対処法をご存知ですか?

を除くすべてのものにマッチする、よりトリッキーな式を構築することで対処できます。 cat , こんな感じです。

^(dog)(?:[^c]|c[^a]|ca[^t])+(cat)?

ここで cat は、アンカーがなければ文字列のどこにでも発生する可能性があります ( デモ2 ).