[C#] 単語の繰り返しを正規表現で探す方法 [ABC 049 C – 白昼夢 / Daydream]

[C#] 単語の繰り返しを正規表現で探す方法 [ABC 049 C – 白昼夢 / Daydream]

[C#] 単語の繰り返しを正規表現で探す方法

C# で正規表現を使って単語が繰り返されているかを判定する方法を調べました。

例えばある文字列に “ABC” が含まれるかどうかは以下のように書けます。

var reg = new Regex("ABC");
if (reg.IsMatch("XXABCBCAAXX"))
{
    Console.WriteLine("OK: XXABCBCAAXX");
} 

“A”, “B”, “C” がこの順番で含まれるかどうかは次のように書けます。

var reg = new Regex(".*A.*B.*C.*");
if (reg.IsMatch("XXXAXBAACB"))
{
    Console.WriteLine("OK: XXXAXBAACB");
}
if (reg.IsMatch("BAC"))
{
    Console.WriteLine("これには一致しない");
}

“ABC”が繰り返して作られる文字列か判定

では最後に “ABC” の繰り返しでできた文字列かどうかを判定します。

(ABC) とするとカッコの中身を1つのグループとして判定します。

よってこれの繰り返しを判定すればよいです。

var reg = new Regex("^(ABC)+$");
if (reg.IsMatch("ABCABCABC"))
{
    Console.WriteLine("OK: ABCABCABC");
}
if (reg.IsMatch("ABCABCAB"))
{
    Console.WriteLine("これには一致しない");
}
if (reg.IsMatch("AXBC"))
{
    Console.WriteLine("これには一致しない");
}
if (reg.IsMatch("ABC"))
{
    Console.WriteLine("OK: ABC");
}

ABC 049 C – 白昼夢 / Daydream

C – 白昼夢 / Daydream

AtCoder の問題で正規表現を使えば簡単に解ける問題があったので試してみます。

問題は以下のような内容です。

英小文字からなる文字列 S が与えられます。
T が空文字列である状態から始め、以下の操作を好きな回数繰り返すことで S = T とすることができるか判定してください。

T の末尾に dream dreamer erase eraser のいずれかを追加する。

簡単に言うと、与えられた文字列が “dream”, “dreamer”, “erase”, “eraser” の単語の繰り返しで構成できるかどうかを問われています。

正規表現を使うと一発で答えが出せます。

var s = Console.ReadLine();
var reg = new Regex("^(dream|dreamer|erase|eraser)+$");
if (reg.IsMatch(s))
{
    Console.WriteLine("YES");
}
else
{
    Console.WriteLine("NO");
}

これでACします。

以上。

未分類カテゴリの最新記事