Регулярные выражения C # - возможно ли извлекать совпадения во время сопоставления?
-
20-08-2019 - |
Вопрос
Допустим, у меня есть строка, которая мне нужна для проверки правильного формата;например , RR1234566-001
(2 буквы, 7 цифр, тире, 1 или более цифр).Я использую что-то вроде:
Regex regex = new Regex(patternString);
if (regex.IsMatch(stringToMatch))
{
return true;
}
else
{
return false;
}
Это работает, чтобы сказать мне, является ли stringToMatch
следует шаблону, определяемому patternString
.Однако что мне нужно (и в конечном итоге я извлеку их позже), так это:123456
и 001
-- то естьчасти из stringToMatch
.
Пожалуйста, обратите внимание, что это НЕ вопрос о том, как создавать регулярные выражения.То, о чем я прошу, это:"Есть ли способ сопоставлять и извлекать значения одновременно без необходимости использовать функцию разделения позже?"
Решение
Для достижения этой цели вы можете использовать группы регулярных выражений.Например, это регулярное выражение:
(\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\\".Полезно для регулярных выражений и путей.
P.S.2.Первая группа хранится в Group[1], а не Group[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;
}