2010-11-26 10 views
0

나는 C#으로 텍스트를 가지고 있는데, 정규 표현식을 사용하여 "match"가 필요하고 값을 얻기 위해 텍스트를 파싱해야한다.RegExpr을 얻기 위해 값을 얻으려면

있는 텍스트 :

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

var asunto2 = "ID P20101125_0003 어떤 문자 텍스트";

var asunto3 = "ID_P20101125_0003 any 텍스트";

나는 값을 얻을 필요

var에 peticion = "P20101125_0003을";

나는이 정규 표현식을 가지고 있지만, 나를 위해 실패

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

답변

3

귀하의 정규 표현식은 "선/텍스트가 종료합니다"라는 "$"로 끝납니다. 너는 그걸 원하지 않아. 이 줄을 그냥 제거하십시오.

대부분이 즉시 작동합니다. 그런 다음 캡처 그룹을 추가하여 원하는 텍스트 비트를 분리해야합니다.

using System.Text.RegularExpressions;을 추가 할 때마다 매번 Regex의 자격을 취득 할 필요가 없습니다. Match으로 전화 한 다음 성공을 확인하여 두 번 일치하지 않게 할 수도 있습니다.

샘플 코드 :

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

가 왜 아래와 같은 문자열을 사용

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

아마도 유효성 검사를 수행하지 않기 때문일 수 있습니다. –

+0

이제 Jon에게 감사드립니다. :) – jerjer

0

이 정규식 당신에게 줄 것이다 원하는 문자열이 그냥 날하지만 것들을에게 수 있습니다

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

문자열을 의미있는 값으로 파싱하는 것과 같이 좀 더 자세한 내용을 선호합니다 :

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