|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrew Sagulin 2:6037/1.28 24 Nov 2002 02:54:08 To : vilfred Subject : Проблемы с логикой регулярных выражений -------------------------------------------------------------------------------- 24 Nov 02 01:23, vilfred wrote to Andrew Sagulin: AS>> $txt =~ /(?:(abra\d).+?)+myexp/; v> ?: - группировка просто. Да знаю, я же её сам написал... :) v> ты написал дословно следующее v> выдрать ненулевое число abra\d на минимальном расстоянии от myexp, v> повторяющееся больше чем один раз. Hе "больше, чем один раз", а "один и более раз". Кстати, /(?:(abra\d).+?)*myexp/ работает аналогично. v> Знак вопроса при квантификаторе + делает его щедрым, еслиб знака вопроса v> небыло бы, то он был бы жадным, т.е. высветил бы самое первое(т.е. самое v> далеко от него расположенное) вхождение abra\d от myexp. Ок, тогда объясни, почему /(?:(abra\d).+?)myexp/ всегда выдаёт "abra1". v> я бы проще поступил: print $1 if $txt=~m&(abra.*?)\s.*?myexp&; Твой пример выдаёт "abra1", т.е. не работает. AS>> 2All: Объясните, почему он работает? :) Я думал, AS>> он должен выдать массив из AS>> всех abra\d, стоящих перед myexp, а он выдаёт AS>> только самый последний. v> поставь m/regex/g, тогда по идее должен выдать массив всех. Hе должен. Подстрока myexp - в единственном экземпляре, поэтому и решение будет одно. Я думаю, чтобы понять, почему приведённое в самом начале выражение работает именно так, умозрительных рассуждений будет не достаточно: надо построить соответствующий конечный автомат и пройтись по нему, но мне это "слабО", да и не стоит оно того, пожалуй. Всего Вам... Андpей. --- GoldED+/W32 1.1.5-20011130 * Origin: В стране не без народа. (2:6037/1.28) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор Архивное /ru.perl/27923de00bb0.html, оценка из 5, голосов 10
|