Регулярные выражения C# - можно ли извлекать совпадения при сопоставлении?

скажем, у меня есть строка, которую мне нужно проверить правильный формат; например RR1234566-001 (2 буквы, 7 цифр, тире, 1 или более цифр). Я использую что-то вроде:

        Regex regex = new Regex(patternString);
        if (regex.IsMatch(stringToMatch))
        {
            return true;
        }
        else
        {
            return false;
        }

это работает, чтобы сказать мне, является ли stringToMatch следует шаблону, определяемому patternString. Что мне нужно, хотя (и я в конечном итоге извлекаю их позже) : 123456 и 001 -- т. е. части stringToMatch.

обратите внимание, что это не вопрос о том, как строить регулярные выражения. что я я спрашиваю: "есть ли способ одновременно сопоставлять и извлекать значения без необходимости использовать функцию split позже?"

4 ответов


для этого можно использовать группы регулярных выражений. Например, это регулярное выражение:

(\d\d\d)-(\d\d\d\d\d\d\d)

давайте сопоставим номер телефона с этим регулярным выражением:

var regex = new Regex(@"(\d\d\d)-(\d\d\d\d\d\d\d)");
var match = regex.Match("123-4567890");
if (match.Success)
    ....

если он совпадает, вы найдете первые три цифры в:

match.Groups[1].Value

и вторые 7 цифр в:

match.Groups[2].Value

P. S. В C#, вы можете использовать @"" строка стиль, чтобы избежать экранирование обратной косой черты. Например, @ "\hi\ "равно" \ \ hi\\". Полезно для регулярных выражений и пути.

С. П. 2. Первая группа хранится в группе[1], а не в группе[0], как можно было бы ожидать. Это потому, что Group[0] содержит всю согласованную строку.


вместо этого используйте группировку и совпадения.

то есть:

// NOTE: pseudocode.
Regex re = new Regex("(\d+)-(\d+)");
Match m = re.Match(stringToMatch))

if (m.Success) {
  String part1 = m.Groups[1].Value;
  String part2 = m.Groups[2].Value;
  return true;
} 
else {
  return false;
}

вы также можете назвать матчи, как это:

Regex re = new Regex("(?<Part1>\d+)-(?<Part2>\d+)");

и доступ к такой

  String part1 = m.Groups["Part1"].Value;
  String part2 = m.Groups["Part2"].Value;

вы можете использовать круглые скобки для записи группы символов:

string test = "RR1234566-001";

// capture 2 letters, then 7 digits, then a hyphen, then 1 or more digits
string rx = @"^([A-Za-z]{2})(\d{7})(\-)(\d+)$";

Match m = Regex.Match(test, rx, RegexOptions.IgnoreCase);

if (m.Success)
{
    Console.WriteLine(m.Groups[1].Value);    // RR
    Console.WriteLine(m.Groups[2].Value);    // 1234566
    Console.WriteLine(m.Groups[3].Value);    // -
    Console.WriteLine(m.Groups[4].Value);    // 001
    return true;
}
else
{
    return false;
}

string text = "RR1234566-001";
string regex = @"^([A-Z a-z]{2})(\d{7})(\-)(\d+)";
Match mtch = Regex.Matches(text,regex);
if (mtch.Success)
{
    Console.WriteLine(m.Groups[1].Value);    
    Console.WriteLine(m.Groups[2].Value);    
    Console.WriteLine(m.Groups[3].Value);    
    Console.WriteLine(m.Groups[4].Value);    
    return true;
}
else
{
    return false;
}