RegExpr в С# для получения значения

У меня есть любой текст на С#, и мне нужно «сопоставить» с помощью регулярных выражений и получить значение (анализ текста для получения значения).

Тексты:

var asunto1 = "ID P20101125_0003 -- Проверка авторизации --";

var asunto2 = "ID P20101125_0003 любой текст любой текст";

var asunto3 = "ID_P20101125_0003 любой текст любой текст";

Мне нужно получить значение:

петиция вар = "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);
//...
            }

person Kiquenet    schedule 26.11.2010    source источник


Ответы (4)


Ваше регулярное выражение заканчивается знаком "$", который говорит, что "строка/текст должны там заканчиваться". Вы не хотите этого. Просто избавьтесь от этой строки:

patternPeticionEV.Append(@"$");

и это будет в основном работать сразу. Затем вам просто нужно добавить группу захвата, чтобы изолировать фрагмент текста, который вы хотите.

Я бы также рекомендовал добавить 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");
        }
    }
}
person Jon Skeet    schedule 26.11.2010

Это может быть только я, но для таких вещей, как синтаксический анализ строк в значимые значения, я предпочитаю делать что-то более подробное, например:

    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;
    }
person VVS    schedule 26.11.2010

Почему бы не использовать подстроку, как показано ниже:

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
person jerjer    schedule 26.11.2010
comment
Предположительно, потому что это не выполняет никакой проверки. - person Jon Skeet; 26.11.2010

Это регулярное выражение даст вам желаемую строку

^ID[_ ]P[0-9_]+?
person Shekhar    schedule 26.11.2010