И / или оператор в регулярном выражении

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

^(part1|part2)$

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

5 ответов

Решение

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

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

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

part1
part2, part1
part1, part2, part3

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

part1,           //with and without trailing spaces.
part3, part2, 
otherpart1
'^(part1|part2|part1,part2)$'

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

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

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

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

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

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

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

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

^(?:part[12]|(part)1,\12)$

Использовать ,
если в vim:

:s/{\|}/"/g

заменит {и} на "так что {lol} станет"lol"

Другие вопросы по тегам