Написал я вот такой паттерн:
$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
Буду рад любым разъяснениям по данной теме.