1

パターンマッチングの勉強を始めました!

var stringToBeProcessed = "***???^^^^";
  1. この文字列に [*, ?, ^] のみが含まれているかどうかを確認する必要があります

  2. この文字列には、5 つの疑問符、5 つの星、または 5 つの ^が連続して含まれていてはなりません (ただし、それらは分散して存在する可能性があります)。(つまり) *または ????? または ^^^^^ は無効です。

    無効なテスト ケース:

** ??????? * *???^^ // 問題が 5 回連続して繰り返されるため、無効です。

% * // [*, ?, ^] 以外の記号が存在する。したがって無効

編集:

string.Contains() メソッドを使用して、上記のパターンを確認します。

私がしたのはこれだけでした:

string.contains("*****") || string.contains("^^^^^") || string.contains("?????") is true => is invalid

また

string.toCharArray().All(char => isCharIn(*,?,^)) is false => is invalid

許容シンボルが巨大になると、私のコードも巨大になるため、上記の方法は悪いです。最適化された単純な例はありますか? おそらく正規表現でより良い方法ですか?

4

1 に答える 1

2

次のような正規表現を使用できます。

^(([*?^])(?<!\2{5}))+$

back-reference\2です。つまり、2 番目のキャプチャ グループ (文字クラス) で以前に一致したものと正確に一致します。これは、の後読みとして知られているもので、前の文字が指定されたパターンに一致する文字列を拒否することを意味します。(?<!...)

これは、同じ文字の連続した 5 つのインスタンスを含まない限り、、、、または文字*?任意のシーケンスと一致します。^

例えば:

Regex.IsMatch("***???^^^^", @"^(([*?^])(?<!\2{5}))+$");    // true
Regex.IsMatch("***???^^^^^", @"^(([*?^])(?<!\2{5}))+$");   // false
于 2013-11-11T07:07:34.313 に答える