2016-04-14 3 views
0

Dieses Spiel mir keine Treffer schenkt, scheinbar egal was:C# regex (aus einem Perl/javascript Hintergrund)

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); 

Aber diese PCRE regex perfekt an regex101.com verhält: ^(\s{3}){0,}(\s{5})*$

Es passt immer gierig zu der kleinen Gruppe (3er-Sätzen) und passt die große Gruppe nur so an, dass keine Leerzeichen am Ende nicht übereinstimmen.

Meine Frage ist, was muss ich tun, um die Regex wie erwartet in C# zu verhalten? Wenn ich raten müsste, an dieser Stelle lehne ich mich an {,} vielleicht illegal? Ich weiß es nicht.

+0

Regex-Regel ist unklar. Könnten Sie das mit einigen Beispielen erklären? –

+0

Ein Grund ist '{0,}' und '*' am Ende und es passt hier ziemlich gut. Also fragst du um ** Laienheit ** an zwei Stellen. Seit '*' bedeutet "Null" oder mehr. Es nimmt Null für '{0,}' und auch für '*' und passt somit zu nichts. –

+0

Sie können es zu regex101.com hinzufügen und dann einfach die Leertaste drücken, um die Länge der Zeichenfolge zu ändern. Es sollte nicht bis 3 Felder zusammenpassen, dann nicht zusammenpassen, dann die rechte Seite an 5 Räumen zusammenbringen. Nicht mit 7 übereinstimmen, und danach in ein Muster mit 0,1 oder 2 Matches auf der rechten Seite und dem Rest ein Match auf der linken Seite fallen. –

Antwort

2

Ich kann Java Einfluss sehen. Die @ bedeutet, dass Sie nicht das Übel brauchen entkommen Flucht \\:

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

Falls Sie nicht wissen, Java reguläre Ausdrücke ein Schmerz sind. Die meisten Sprachen sind nicht so. Python zum Beispiel verwendet r anstelle von C# @.


Edit: JavaScript nur macht Sie entkommt innerhalb von Strings zu entkommen, aber man kann so etwas verwenden: var word2 = word.replace(/\s/g, "");. Die Syntax ist tatsächlich ähnlich zu Perl.

Java hat keine Alternative zu entkommenen Fluchten, weshalb ich angenommen habe, du meintest Java.

+0

JavaScript, auch. Wenn Sie die Regex in Form eines Zeichenfolgenliterals erstellen, müssen Sie doppeltes Escapen ausführen, wie in Java. –