- perl: затык с регэкспом, gibbon, 02:46 , 30-Июн-11 (1)
>[оверквотинг удален] > #!/usr/bin/perl > $_ = 'qwerty'; > if ($_ =~ / (([^e]|e)*) > /x) { print "$1\n" }; > Я ожидаю, что совпадет первая альтернатива в позиции строки до "e", как > и в первом случае. > Но совпадает вся строка - в $1 имеем qwerty. > Может я затупил конкретно или не понимаю сути... в общем, не могу > разобраться в поведении этого выражения. > Разъясните, что к чему, если не сложно...Как-то у вас все запутною Зачем писать такие регэкспы? А работают они так как и должны. Первый вариант. Здесь вы в сущности ищите подстроку состоящую из не 'e' или из 't'. Регэксп просматривает вашу строку qwerty слева направо. Итак, первая буква 'q' это не 'e', она попадает в группу и продолжается просмотр. Вторя буква 'w', это тоже не 'e' и она попадает в группу и продолжается просмотр. Третья буква 'e', под условие не 'e' она не попадает, не попадает она и под альтернативную 't', так что на этом просмотр заканчивается и в группе итого 'qw'. Регэксп ищет первое совпадение с шаблоном и на этом останавливается. Второй вариант. Здесь в регэкспе ([^e]|e) это все что не 'e' или 'e'. В сущности под это попадают все символы. Можно было записать там просто точку. Регэксп просматривает все символы строку 'qwerty' и они все подходят под ваше условие. В итоге в группе оказывается вся строка 'qwerty'.
- perl: затык с регэкспом, cryo, 04:09 , 30-Июн-11 (2)
- perl: затык с регэкспом, Pahanivo, 07:12 , 30-Июн-11 (3)
- perl: затык с регэкспом, reekoff, 10:05 , 30-Июн-11 (4)
- perl: затык с регэкспом, cryo, 12:06 , 30-Июн-11 (5)
- perl: затык с регэкспом, reekoff, 12:17 , 30-Июн-11 (6)
- perl: затык с регэкспом, ACCA, 16:58 , 30-Июн-11 (7)
- perl: затык с регэкспом, reekoff, 17:41 , 30-Июн-11 (8)
- perl: затык с регэкспом, gibbon, 23:46 , 30-Июн-11 (9)
>[оверквотинг удален] > как скобки захватывают все выражение, в $1 пишется все. Так я > понимаю? > Итак, > 'не e' совпадает с q, далее по * 'не e' совпадает > с w, далее 'не e' не совпадает с e (временная неудача > поиска) и переход на вторую альтернативу в начало строки - 'e' > не совпадает с q (временная неудача) - переход на первую альернативу > в позицию за e, так как qwe уже обработано. Далее совпадение > до конца строки. > Я гоню? А то, что-то больше у меня никак не получается...Думаю вы не понимаете что ([^e]*|e*) != ([^e]|e)*.
- perl: затык с регэкспом, reekoff, 18:07 , 01-Июл-11 (12)
|