Как использовать условные конструкции в регулярных выражениях на .net?

Пользователь

от willa_will , в категории: Другие , 6 месяцев назад

Как использовать условные конструкции в регулярных выражениях на .net?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от krista , 6 месяцев назад

@willa_will 

В регулярных выражениях на .NET есть два основных способа использования условных конструкций: с помощью синтаксиса (?(condition)yes|no) и с помощью подвыражений (?(number)yes|no).


Синтаксис (?(condition)yes|no) позволяет задать условие, которое будет проверяться перед продолжением сопоставления. Если условие истинно, выполняется выражение yes, а если ложно - выражение no.


Пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
string pattern = @"(?(To|Cc|Bcc)(w+@w+.w+)|(w+))";
string input = "To: [email protected]";

Match match = Regex.Match(input, pattern);
if (match.Success)
{
    if (match.Groups[2].Success)
    {
        Console.WriteLine("Email address: " + match.Groups[2].Value);
    }
    else if (match.Groups[3].Success)
    {
        Console.WriteLine("Username: " + match.Groups[3].Value);
    }
}


В этом примере регулярное выражение (?(To|Cc|Bcc)(w+@w+.w+)|(w+)) проверяет, есть ли перед адресом почты префиксы "To:", "Cc:" или "Bcc:". Если есть, то сопоставляется адрес электронной почты, а если нет, то сопоставляется только имя пользователя.


Синтаксис (?(number)yes|no) позволяет задать условие на основе того, сопоставились ли подвыражения с определенными номерами. Если подвыражение с номером number сопоставлено, выполняется выражение yes, а если нет - выражение no.


Пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
string pattern = @"(a)|(b)|(c)|(?(1)d|e)";
string input = "a";

Match match = Regex.Match(input, pattern);
if (match.Success)
{
    if (match.Groups[4].Success)
    {
        Console.WriteLine("Matched group 4: " + match.Groups[4].Value);
    }
    else
    {
        Console.WriteLine("Did not match group 4");
    }
}


В этом примере регулярное выражение (a)|(b)|(c)|(?(1)d|e) проверяет, была ли сопоставлена буква "a". Если была, то сопоставляется буква "d", а если нет - буква "e".