2017-05-08 2 views
1

Ich habe eine Zeichenfolge, die ich mit Regex in C# abgleichen möchte.C# Regex stimmt nicht mit Regex101 überein

Die Zeichenfolge ist Hello1004,"7".

Ich erstelle die Regex mit

var reg = new Regex(@"hello\s*\[?\s*,?\s*(?<group1>\d+)\s*,\s*""(?<group2>[^""]+)""", RegexOptions.IgnoreCase); 

(Es können mehrere Räume, ein [ oder ein , vor 1004.)

1004 nicht immer 1004 sein kann, aber es wird immer eine 4-stellige Nummer.

Was ich versuche zu bekommen:

  • Gruppe1: 1004
  • group2: 7

Sie können here eine Regex101 Demo sehen.

Es funktioniert perfekt in der Demo, aber wenn

foreach (var match in reg.Matches(text)) 
{ 
    var group1 = match.Groups["group1"]?.Value; 
    var group2 = match.Groups["group2"]?.Value; 
} 

group1 leer zu tun ist und group2 hat 1004 drin. Wenn ich ein Leerzeichen zwischen Hello und 1004 setze, funktioniert es gut in C#.

Kann jemand erklären, warum ich diese Diskrepanz zwischen den beiden bekomme?

Ich bin mit Visual Studio 2017, .NET Framework 4.

+2

See http://ideone.com/FA8WNg, so scheint es zu arbeiten. –

+0

Das gleiche hier. Hat einen Test in LinqPad: var s = @ "Hallo1004," "7" ""; \t \t var reg = neue Regex (@ "Hallo \ s * \ [? \ S *,? \ S * (? \ d +) \ s *, \ s *" "(? [^" "] +) "" ", RegexOptions.IgnoreCase); \t \t reg.Match (s).Dump(); – Vidar

+0

@ WiktorStribiżew Hmmm ... Das scheint zu funktionieren. Allerdings funktioniert es definitiv nicht in meiner realen Anwendung. Ich werde die Frage mit meiner Version von .NET aktualisieren, falls das zutrifft. –

Antwort

0

denke ich, ein Problem ist, dass in der foreach-Funktion, C# ist nicht die Bestimmung des Rückgabetypen von foreach(var match in reg.Matches(text)) aus einer Variante zu erstellen.

ich diesen Fehler in C# VS2015
Program.cs(48,24,48,30): error CS1061: 'object' does not contain a definition for 'Groups' and no extension method 'Groups' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

aber geändert, wenn explizite Typisierung Match es kompiliert und ausgeführt ist wie es
ist sollte.

 var text = @"Hello1004,""7"""; 
     var reg = new Regex(@"hello\s*\[?\s*,?\s*(?<group1>\d+)\s*,\s*""(?<group2>[^""]+)""", RegexOptions.IgnoreCase); 
     foreach (Match match in reg.Matches(text)) 
     { 
      var group1 = match.Groups["group1"]?.Value; 
      var group2 = match.Groups["group2"]?.Value; 
      Console.WriteLine("{0} , {1}", group1, group2); 
     } 

Ausgabe

1004 , 7 
0

Ich bin Ihr Problem zu raten ist, dass Sie zu spezifisch sind. Das erste, was Sie tun möchten, ist 4-stellig übereinstimmen und dann den Inhalt von "..." übereinstimmen. Du musst das nur sagen. Passen Sie Dinge, die Sie nicht benötigen, nicht an, es sei denn, Sie verwenden sie als Anker oder Validierung.

(?<group1>\d{4})[^"]*"(?<group2>[^"]*) 
Verwandte Themen