2010-11-26 44 views
0

J'ai n'importe quel texte en C#, et j'ai besoin de "match" en utilisant des expressions régulières, et obtenir une valeur (analyse du texte pour obtenir la valeur).RegExpr en C# pour obtenir la valeur

Textes:

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

var asunto2 = "ID P20101125_0003 n'importe quel texte ";

var asunto3 = "ID_P20101125_0003 n'importe quel texte ";

J'ai besoin d'obtenir la valeur:

var peticion = "P20101125_0003";

J'ai cette expression régulière, mais échoue pour moi:

//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); 
//... 
      } 

Répondre

3

Votre expression régulière se termine par « $ » qui dit « la ligne/texte doit se terminer là. » Tu ne veux pas ça. Il suffit de se débarrasser de cette ligne:

patternPeticionEV.Append(@"$"); 

et il travaillera principalement immédiatement. Vous avez juste besoin d'ajouter un groupe de capture pour isoler le bit de texte que vous voulez.

Je vous recommande également d'ajouter using System.Text.RegularExpressions; de sorte que vous ne devez pas vous qualifier pleinement Regex chaque fois. Vous pouvez également appeler Match, puis vérifier la réussite, pour éviter de l'apparier deux fois.

Exemple de code:

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

Pourquoi ne pas utiliser substring comme ci-dessous:

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

Probablement parce que cela n'effectue aucune validation. –

+0

Maintenant, je sais, merci Jon! :) – jerjer

0

Cette regex vous donnera la chaîne désirée

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

Cela pourrait être juste moi, mais pour les choses comme les chaînes d'analyse en valeurs significatives je préfère faire quelque chose de plus verbeux comme ceci:

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