Регулярное выражение в условном или с точным количеством цифр - PullRequest
2 голосов
/ 08 июля 2019

Я изо всех сил пытался добиться регулярного выражения с оператором или.

Например Имея следующую цепочку: Допустимые числа: 1, 2, 5, 6, 20

"/ путь / пункт / 1"

"/ путь / пункт / 2"

"/ путь / пункт / 5" и т.д.

Регулярное выражение, которое я тестировал:

"/\/path\/item\/(1|2|5|6|20)/"

Я хочу, чтобы регулярное выражение возвращало true, только если оно равно 1, 2, 5 или 6 и т. Д.

Но для примера числа 20 регулярное выражение возвращает true для 2, а не для 20.

Как я могу проверить каждое значение независимо, то есть, оно истинно, только если оно равно 2, а не 20. Но верно, когда оно равно 20, но не 2.

Каким было бы регулярное выражение для реализации этой проверки? EJEMPLO

Ответы [ 3 ]

1 голос
/ 08 июля 2019

Вам нужно ограничить поиск так, чтобы совпадающие цифры приводили вас к концу строки:

"/\/path\/item\/(1|2|5|6|20)$/"

Это будет означать, что цифры должны точно совпадать, и этоне требует переупорядочения допустимых значений в вашем регулярном выражении.

Демонстрируется здесь

1 голос
/ 08 июля 2019

Ключ состоит в том, чтобы сначала добавить большие числа в группу захвата или отсутствия захвата, например:

^\/path\/item\/(20|1|2|5|6)$

или

^\/path\/item\/(?:20|1|2|5|6)$

или

\/path\/item\/(?:20|1|2|5|6)

Test

$re = '/^\/path\/item\/(20|1|2|5|6)$/s';
$str = '/path/item/20';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

var_dump($matches);

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

0 голосов
/ 08 июля 2019

Проблема с вашим кодом заключалась в том, что всякий раз, когда вы отправляли 20 для совпадения, 2 сопоставлялось первым и игнорировалось, так как также было 0 после. Эту проблему можно решить, указав сначала 20, например:

\/path\/item\/(20|1|2|5|6)\/

Смотреть здесь: https://regex101.com/r/aJf1Q8/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...