17_planet
@17_planet
Full Stack Developer, web-studio in Odessa

Регулярные выражения. Почему именно такая форма патерна для поиска рабочая?

Написал я вот такой паттерн:
$pattern = '/   (^|'.PHP_EOL.')   (.*?(\b|\.))     \s-\s   \b    (.*(\b|\.)?)   ('.PHP_EOL.'|$)?   /iux';

Для поиска строк типа: Москва - Одесса
Результат — по идее полностью рабочий. По крайней мере по подобранном мною примеру (прим. во вложениях) проходит на ура.

Это первая регулярка которую я собственно написал, но мелкие детали не совсем понятны самому, хотелось выяснить почему именно так. По-моему скромному мнению левая и правая части должны были выглядеть одинаково для их одинакового исполнения, но в итоге необходимы различия, иначе не работает.:
Под частями я имею ввиду:
  • Левая:
    '(.*?(\b|\.))';

  • Правая:
    '(.*(\b|\.)?)';



1) Почему в правой части, необходимо отбрасывать оператор "?", иначе туда лепиться пустая строка, почему не так как в первой: этот * квантификатор сжирает всё если его не оставливать ленью ("?")?
2) Аналогичный вопрос, но наоборот. Для этой части (\b|\.), почему в первом случае оператор "?" не нужен, а во втором оказался необходим?
3) Еще одна особенность, которую я подправил, для этой же части (\b|\.)....
Если я не ошибся, условие или я могу использовать в обоих типах скобок (квадратные и круглые).
Прим.:
(a|b)
[a|b]

Исправьте если не так...
Так вот, все ок и так же само работает, если в правой части вместо круглых поставить квадратные, но не так если в левой части сделать также. Вопрос почему так?

Тестовый пример на 40 строк в txt - https://yadi.sk/i/rsTtColbgjSkp

Буду рад любым разъяснениям по данной теме.
  • Вопрос задан
  • 297 просмотров
Пригласить эксперта
Ответы на вопрос 1
He11ion
@He11ion
PHP-monkey
https://regex101.com/r/kX1cX7/2 - рабочий вариант, надо обернуть пары городов в () и заменить EOL на \R

Почему не работала оригинальная - увы, не скажу, лень копаться.

[] != () - разные типы группировок и разное поведение, за подробностями - в гугл.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы