Подтвердить что ты не робот

Использование оператора Regex OR для решения двух условий

Я пытаюсь объединить 2 регулярных выражения в 1 с оператором OR: |

У меня есть тот, который проверяет соответствие буквы, за которой следуют 8 цифр:

Regex.IsMatch(s, "^[A-Z]\d{8}$")


У меня есть другой, который проверяет просто 9 цифр:

Regex.IsMatch(s, "^\d{9}$")


Теперь, вместо того, чтобы делать:

If Not Regex.IsMatch(s, "^[A-Z]\d{8}$") AndAlso
   Not Regex.IsMatch(s, "^\d{9}$") Then 
    ...
End If


Я думал, что могу просто сделать:

If Not Regex.IsMatch(s, "^[A-Z]\d{8}|\d{9}$") Then
    ...
End If


По-видимому, я не правильно совмещаю эти два и, видимо, я ужасен в регулярных выражениях. Любая помощь будет высоко оценена.

И для тех, кто задавался вопросом, я взглянул на Как объединить 2 условия и более в regex, и я все еще царапаю себе голову.

4b9b3361

Ответ 1

Как насчет использования ^[A-Z0-9]\d{8}$?

Ответ 2

Оператор | имеет высокий приоритет, и в исходном регулярном выражении он будет применяться первым. Вы должны комбинировать два скобки с регулярным выражением с группировкой, чтобы сделать приоритет прозрачным. Как в:

"^(([A-Z]\d{8})|(\d{9}))$"

Ответ 3

Я думаю, вы хотите сгруппировать условия:

Regex.IsMatch(s, "^(([A-Z]\d{8})|(\d{9}))$")

The ^ и $представляют начало и конец строки, поэтому вы не хотите, чтобы их рассматривали в состоянии или условии. Параны позволяют вам четко указывать "все в этом паре" или "что-либо в этом другом"

Ответ 4

Предложение

@MikeC кажется лучшим:

^[A-Z0-9]\d{8}$

... но что касается того, почему ваше выражение работает не так, как вы могли бы ожидать, вы должны понимать, что оператор | или "или чередование" имеет очень высокий приоритет - только высший - это я полагаю. Если вы используете свой пример:

^[A-Z]\d{8}|\d{9}$

... вы в основном говорите "начало начала строки, заглавная буква, затем 8 цифр ИЛИ соответствуют 9 цифрам, а затем конец строки" - если вместо этого вы имеете в виду "начало начала строки", затем следует заглавная буква на 8 цифр, затем конец строки ИЛИ начало строки, за которой следуют 9 цифр, а затем конец строки ", то вы хотите один из них:

^([A-Z]\d{8}|\d{9})$
^[A-Z]\d{8}$|^\d{9}$

Надеюсь, это полезно для вашего понимания.

Ответ 5

Я считаю, что оператор OR также немного странный, что я делаю, я использую группы для обозначения разделов, которые я хочу сопоставить, поэтому ваше регулярное выражение будет выглядеть примерно так: ^(([A-Z]\d{8})|(\d{9}))$