Группы в регулярных выражениях — очень важная концепция, и они являются нашим мостом к продвинутым приложениям регулярных выражений.
Понятие группы.
Результат сопоставления с регулярным выражением можно разделить на несколько частей. В этом и заключается цель группы. После того, как вы сможете гибко использовать группы, вы обнаружите, что Regex действительно удобен и эффективен.
Давайте сначала рассмотрим пример:
public static void Main().
{
строка s = "21 февраля 2005 г.";
Regex reg = new Regex(@"(?<y>d{4})-(?<m>d{1,2})-(?<d>d{1,2})",RegexOptions .Скомпилировано);
Матч match = reg.Match(s);
intyear = int.Parse(match.Groups["y"].Value);
int месяц = int.Parse(match.Groups["m"].Value);
int day = int .Parse(match.Groups["d"].Value);
DateTime время = новое DateTime(год,месяц,день);
Console.WriteLine(время);
Консоль.ReadLine();
}
В приведенном выше примере строка анализируется по группам и преобразуется в экземпляр DateTime. Конечно, эту функцию можно легко реализовать с помощью метода DateTime.Parse.
В этом примере я использую (?<имя>), чтобы разделить результаты сопоставления на три группы «y», «m» и «d», представляющие год, месяц и день соответственно.
Теперь, когда у нас есть концепция групп, давайте посмотрим, как их группировать. Это очень просто. В дополнение к описанному выше методу мы можем определить группу с помощью пары скобок. Например, приведенный выше пример можно изменить на:
общественная статическая пустота Main()
{
строка s = "21 февраля 2005 г.";
Regex reg = new Regex(@"(d{4})-(d{1,2})-(d{1,2})",RegexOptions.Compiled);
Матч match = reg.Match(s);
intyear = int.Parse(match.Groups[1].Value);
int месяц = int.Parse(match.Groups[2].Value);
int day = int .Parse(match.Groups[3].Value);
DateTime время = новое DateTime(год,месяц,день);
Console.WriteLine(время);
Консоль.ReadLine();
}
Как видно из приведенного выше примера, группе, входящей в первую пару скобок, автоматически присваивается номер 1, а следующим скобкам присваиваются номера 2, 3...
public static void Main()
{
строка s = "21 февраля 2005 г.";
Regex reg = new Regex(@"(?<2>d{4})-(?<1>d{1,2})-(?<3>d{1,2})",RegexOptions .Скомпилировано);
Матч match = reg.Match(s);
intyear = int.Parse(match.Groups[2].Value);
int месяц = int.Parse(match.Groups[1].Value);
int day = int .Parse(match.Groups[3].Value);
DateTime время = новое DateTime(год,месяц,день);
Console.WriteLine(время);
Консоль.ReadLine();
}
выше
примеру, мы используем (?<number>) для ручной нумерации группы каждой пары скобок (обратите внимание, что я не определял позиции 1 и 2 слева направо).
Мы знаем три способа определения группы для регулярного выражения и соответствующие способы ссылки на результаты сопоставления групп.
Затем, что касается определения группы, обратите внимание еще на два момента:
1. Поскольку для определения групп используются скобки, поэтому, если вы хотите сопоставить "(" и ")", используйте "(" и ")" (для всех специальный Для определения символов обратитесь к соответствующей справочной документации по выражениям Regex).
2. Если при определении Regex используется параметр ExplicitCapture, второй пример не удастся, поскольку для этого параметра требуется явно определенная группа с номером или именем для захвата и сохранения результатов. Если вы не определите параметр ExplicitCapture, а иногда и. Если вы определяете выражение, похожее на (A|B), и не хотите фиксировать результат этого (A|B), вы можете использовать синтаксис «группы без захвата», который определяется как ( ?:) Метод, для (A|B), вы можете определить его следующим образом, чтобы не захватывать и не сохранять его в коллекции Group - (?:A|B).