Як представлений оператор AND / OR як у регулярних виразах?


220

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

^(part1|part2)$

Це лише повертає відповіді 1 і 2 як правильні, тоді як відповідь 3 була б неправильною. Мені зараз цікаво, чи є оператор, схожий на | що говорить and/orзамість either...or.

Може хтось допоможе мені вирішити цю проблему?


1
Регулярні вирази можуть бути не найкращим рішенням для цього. Я б використовував звичайні рядкові методи.
Фелікс Клінг

3
Ця проблема недостатньо конкретизована. Чому ви використовуєте відповідність шаблонів, коли все, що вам потрібно, - це точне порівняння рядків з набором юридичних рядків? Якщо ваш компілятор регулярних виразів не оптимізує альтернативи в структуру трійки O (1) так, як це робить Perl, ви, ймовірно, замість цього робите тест на хеш-членство. Інші двигуни регексу просто не дуже розумні в цьому.
tchrist

@tchrist Прикладом використання може бути $orпоєдинок
Надір Аббас

Відповіді:


284

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

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

Позитивні матчі:

part1
part2, part1
part1, part2, part3

Негативні збіги:

part1,           //with and without trailing spaces.
part3, part2, 
otherpart1

4
Зауважте, що "частина 1, частина" 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)


4

Не фахівець з регексу, але ви можете це зробити ^((part1|part2)|(part1, part2))$. Словами: "частина 1 або частина 2 або обидва"


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.