2016-04-14 1 views
0

この試合は一見どんな、私に何の一致を与えていない:C#の正規表現(perlのから来る/ javascriptのバックグラウンド)

static String divine(int n) 
{ 
    if (n % 3 == 0) { return String.Join("", Enumerable.Repeat("5", n).ToArray()); } 

    String res = String.Join("", Enumerable.Repeat(" ", n)); 
    Regex ItemRegex = new Regex(@"^(\\s{3}){0,}(\\s{5})*$", RegexOptions.Compiled); 
    Match match = ItemRegex.Match(res); 

しかし、このPCRE正規表現はregex101.comで完璧に動作している:^(\s{3}){0,}(\s{5})*$

小さなグループ(3つのセット)に常に貪欲にマッチし、必要に応じて大きなグループとマッチし、最後にスペースがないことを示します。

私の質問は、正規表現をC#で期待どおりに動作させるためには何が必要ですか?私が推測しなければならなかった場合、この時点で私は{,}に向かって傾いている可能性があります?知りません。

+0

正規表現ルールが不明です。あなたはいくつかの例を詳述できますか? –

+0

理由の1つは、最後に '{0、}'と '*'があり、ここで怠惰にマッチしています。だからあなたは2つの場所で**レイネス**を求めています。 '* 'は' 0'以上を意味するためです。これは '{0、}'と '*'のためにゼロをとっているので、何も一致しません。 –

+0

regex101.comに追加してからスペースバーを押すだけで、文字列の長さを変更することができます。それは、3つのスペースまで一致してはならず、次に一致してはならず、次に5つのスペースで右側に一致します。 7でマッチしない。その後、右側に0,1,2マッチのパターンになり、残りは左側にマッチする。 –

答えて

2

Javaの影響を見ることができます。あなたが知らなかった場合には、Javaの正規表現が痛みます

@"^(\s{3}){0,}(\s{5})*$"

@あなたは悪のエスケープエスケープ\\を必要としないことを意味します。ほとんどの言語はそうではありません。たとえばPythonでは、C#の@ではなくrが使用されます。


編集:JavaScriptが唯一のあなたは、文字列内のエスケープをエスケープなりますが、あなたのようなものを使用することができます:var word2 = word.replace(/\s/g, "");を。構文は実際にPerlに似ています。

Javaにはエスケープエスケープの代替手段はありません。そのため、私はあなたがJavaを意味すると考えていました。

+0

JavaScriptもあります。文字列リテラルの形式で正規表現を作成する場合は、Javaと同じように二重にエスケープする必要があります。 –