Роберт
Аналитик
непонятно поведение в регулярном выражении
Есть текст:
(ну тоесть блок выглядит так: дата, потом одна строка с отсупом в один пробел и потом одна или несколько строк с отступом в 2 пробела. И таких блоков может быть много)
Написал регулярное выражение:
которое должно захватывать отдельно дату , отдельно строку с одним пробелом и отдельно весь набор строк с отступом в 2 пробела.
А он почему-то берёт только первую строку из тех что с отступом в 2 пробела. Почему? Запрос полностью корректный - жадный.
Причём самое интересное что пробую запустить это же выражение на PCRE в других языках программирования - захватывает всё до конца блока.
Если вместо последнего плюса напишу {3,} - захватит три , но четвёртую строку уже брать не будет.
Корректно работает только если заменю последнюю точку на "не символы перехода строки" , тоесть на: ((\r\n [^\r\n]+)+)
Но почему в РНР не работает так как он написан изначально? Всё же корректно!
Читается как: переход строки , два пробела , потом как можно больше любых символов , но поскольку нет модификатора "s" то останавливается перед переходом на новую строку , и дальше повторить данный блок как можно больше раз.
Есть у кого-то идеи почему последний плюс обрабатывается как не жадный?
Есть текст:
Код:
12.03.2009 11:54:21
zaq12345
1111112
aaaaaaa3
222ddd333
bbbb1111b
27.03.2009 23:54:21
zz
aaaaaaaaa
111111111
Написал регулярное выражение:
PHP:
preg_match_all('#(\d\d\.\d\d\.\d\d\d\d \d\d:\d\d:\d\d)\r\n (.+?)((\r\n .+)+)#',$Tekst,$Rez);
А он почему-то берёт только первую строку из тех что с отступом в 2 пробела. Почему? Запрос полностью корректный - жадный.
Причём самое интересное что пробую запустить это же выражение на PCRE в других языках программирования - захватывает всё до конца блока.
Если вместо последнего плюса напишу {3,} - захватит три , но четвёртую строку уже брать не будет.
Корректно работает только если заменю последнюю точку на "не символы перехода строки" , тоесть на: ((\r\n [^\r\n]+)+)
Но почему в РНР не работает так как он написан изначально? Всё же корректно!
Читается как: переход строки , два пробела , потом как можно больше любых символов , но поскольку нет модификатора "s" то останавливается перед переходом на новую строку , и дальше повторить данный блок как можно больше раз.
Есть у кого-то идеи почему последний плюс обрабатывается как не жадный?
странно, а в документации другое сказано