Как оператор И / ИЛИ представлен в регулярных выражениях?

221

В настоящее время я программирую словарный алгоритм, который проверяет, правильно ли пользователь ввел слово. У меня следующая ситуация: правильное решение для слова будет «часть1, часть2». Пользователь должен иметь возможность ввести «part1» (ответ 1), «part2» (ответ 2) или «part1, part2» (ответ 3). Теперь я пытаюсь сопоставить строку, заданную пользователем, со следующим, автоматически созданным выражением регулярного выражения:

^(part1|part2)$

Это только возвращает ответы 1 и 2 как правильные, в то время как ответ 3 будет неправильным. Теперь мне интересно, есть ли оператор, похожий на | что говорит and/orвместо either...or.

Может ли кто-нибудь помочь мне решить эту проблему?

Джонатан
источник
1
Регулярные выражения могут быть не лучшим решением для этого. Я бы использовал обычные строковые методы.
Феликс Клинг
3
Эта проблема плохо определена. Почему вы используете сопоставление с образцом, когда все, что вам нужно, это точное сравнение строк с набором допустимых строк? Если ваш компилятор регулярных выражений не оптимизирует альтернативы в структуру дерева O (1) так, как это делает Perl, вам, вероятно, следует вместо этого провести тест на членство в хешах. Другие движки регулярных выражений просто не очень умны в этом.
tchrist
@tchrist Вариант использования может быть $orрегулярным выражением mongodb
Надир Аббас

Ответы:

284

Я предполагаю, что вы хотите динамически построить регулярное выражение, содержащее другие слова, кроме part1 и part2, и что вы хотите, чтобы порядок не имел значения. Если это так, вы можете использовать что-то вроде этого:

((^|, )(part1|part2|part3))+$

Положительные совпадения:

part1
part2, part1
part1, part2, part3

Отрицательные совпадения:

part1,           //with and without trailing spaces.
part3, part2, 
otherpart1
Gaute Løken
источник
4
Обратите внимание, что «part1, part» 1 также будет положительным. Что не всегда желательно
dimaaan
1
@dimaaan Вы ошиблись цитатами? «part1, part1» будет совпадением, но «part1, part» не будет. Хотя вы правы, что такой сценарий не охватывается этим решением, для применения ОП, где он проверяет, состоит ли тестовая строка из слов в словаре, я полагаю, что он действительно хочет получить положительное совпадение, даже если слово повторяется. Слово по-прежнему будет частью словаря, независимо от того, сколько у вас его экземпляров.
Gaute Løken
30
'^(part1|part2|part1,part2)$'

это работает?

Кент
источник
1
Очевидно. регулярное выражение требует, чтобы вся строка соответствовала (^, $)
glasspill
5

Это работает без чередования?

^((part)1(, \22)?)?(part2)?$

или почему не это?

^((part)1(, (\22))?)?(\4)?$

Первый работает для всех условий, второй для всех, кроме part2(с использованием GNU sed 4.1.5)

Potong
источник
4

Не эксперт в регулярных выражениях, но вы можете сделать ^((part1|part2)|(part1, part2))$. На словах: «часть 1 или часть2 или оба»

Черный медведь
источник
2

Или вы можете использовать это:

^(?:part[12]|(part)1,\12)$
FailedDev
источник