2010-11-26 5 views
0

Ich habe einen beliebigen Text in C#, und ich brauche "Match" mit regulären Ausdrücken, und erhalten Sie einen Wert (Parsing den Text für den Wert erhalten).RegExpr in C# für Wert erhalten

Texte:

var asunto1 = "ID P20101125_0003 - Pendiente de autorización -";

var asunto2 = "ID P20101125_0003 beliebig beliebigen Text eingeben";

var asunto3 = "ID_P20101125_0003 beliebig beliebigen Text eingeben";

Ich brauche den Wert zu erhalten:

var petición = "P20101125_0003";

Ich habe diesen regulären Ausdruck, aber nicht für mich:

//ID P20101125_0003 -- Pendiente de autorización -- 

      patternPeticionEV.Append(@"^"); 
      patternPeticionEV.Append(@"ID P"); 
      patternPeticionEV.Append(@"(20[0-9][0-9])"); // yyyy 
      patternPeticionEV.Append(@"(0[1-9]|1[012])"); // MM 
      patternPeticionEV.Append(@"(0[1-9]|[12][0-9]|3[01])"); // dd 
      patternPeticionEV.Append(@"(_)"); 
      patternPeticionEV.Append(@"\d{4}"); 
      //patternPeticionEV.Append(@"*"); 
      patternPeticionEV.Append(@"$"); 

if (System.Text.RegularExpressions.Regex.IsMatch(asuntoPeticionEV, exprRegular, System.Text.RegularExpressions.RegexOptions.IgnoreCase)) 
      { 
       var match = System.Text.RegularExpressions.Regex.Match(asuntoPeticionEV, exprRegular, System.Text.RegularExpressions.RegexOptions.IgnoreCase); 
//... 
      } 

Antwort

3

Ihre regulären Ausdruck endet mit „$“, die besagt, „die Zeile/Text dort enden muss“. Das willst du nicht. Nur loswerden diese Zeile:

patternPeticionEV.Append(@"$"); 

und es wird meist sofort funktionieren. Sie müssen dann nur eine Erfassungsgruppe hinzufügen, um das gewünschte Textstück zu isolieren.

Ich würde auch empfehlen using System.Text.RegularExpressions; hinzufügen, so dass Sie nicht jedes Mal Regex vollständig qualifizieren müssen. Sie können auch Match aufrufen und dann nach Erfolg suchen, um zu vermeiden, dass es zweimal übereinstimmt.

Beispielcode:

using System.Text.RegularExpressions; 

class Test 
{ 
    static void Main() 
    { 
     DisplayMatch("ID P20101125_0003 -- Pendiente de autorización --"); 
     // No match due to _ 
     DisplayMatch("ID_P20101125_0003 any text any text"); 
    } 

    static readonly Regex Pattern = new Regex 
     ("^" + // Start of string 
     "ID " + 
     "(" + // Start of capturing group 
     "P" + 
     "(20[0-9][0-9])" + // yyyy 
     "(0[1-9]|1[012])" + // MM 
     "(0[1-9]|[12][0-9]|3[01])" + // dd 
     @"_\d{4}" + 
     ")" // End of capturing group 
     ); 

    static void DisplayMatch(string input) 
    { 
     Match match = Pattern.Match(input); 
     if (match.Success) 
     { 
      Console.WriteLine("Matched: {0}", match.Groups[1]); 
     } 
     else 
     { 
      Console.WriteLine("No match"); 
     } 
    } 
} 
0

Warum nicht String verwenden, wie unten:

var asunto1 = "ID P20101125_0003 -- Pendiente de autorización --"; 
var asunto2 = "ID P20101125_0003 any text any text"; 
var asunto3 = "ID_P20101125_0003 any text any text"; 

var peticion = asunto1.Substring(3,14); //gets P20101125_0003 
+0

Vermutlich, weil das keine Validierung durchführt. –

+0

Jetzt weiß ich, danke Jon! :) – jerjer

0

Diese Regex geben Ihnen gewünschte Zeichenfolge

^ID[_ ]P[0-9_]+? 
1

Dies könnte nur mich, sondern für Dinge Wenn ich Strings in sinnvolle Werte zerlege, mache ich lieber etwas Ausführlicheres:

private bool TryParseContent(string text, out DateTime date, out int index) 
    { 
     date = DateTime.MinValue; 
     index = -1; 

     if (text.Length < 17) 
      return false; 

     string idPart = text.Substring(0, 4); 

     if (idPart != "ID_P" && idPart != "ID P") 
      return false; 

     string datePart = text.Substring(4, 8); 

     if (!DateTime.TryParseExact(datePart, "yyyyMMdd", System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.None, out date)) 
      return false; 

     // TODO: do additional validation of the date 

     string indexPart = text.Substring(13, 4); 

     if (!int.TryParse(indexPart, out index)) 
      return false; 

     return true; 
    }