Код: Выделить всё
/\/[^\/]*$/
Выражение номер два:
Код: Выделить всё
/(\/)[^\/]*$/
Первый символ взят в скобки и выражение начинает работает так, словно после этих скобок выражение заканчивается, или звёздочка перестаёт быть жадной.

Модераторы: /dev/random, Модераторы разделов
Код: Выделить всё
/\/[^\/]*$/
Код: Выделить всё
/(\/)[^\/]*$/
я тоже считаю, что перловые регулярки не нужны
А на каком наборе данных вы их запускаете?
jojahti писал(а): ↑23.02.2011 19:22А в перле значение шаблона /s(tring)/ то же самое что и в руби получится, то есть исключение s из результирующего выражения? А то я регулярные выражения только по виму знаю, мне их /dev/random "преподавал".Так вот там /s(tring)/ идентично /string/ , что меня и запутало.
Код: Выделить всё
$_ = "Paris in the the the the spring.";
#Удалить повторы слов
s/ \b(\w+) \s (?= \1\b ) //gx;
liaonau писал(а): ↑23.02.2011 20:49Вот пример из Camel Book:
Код
Код: Выделить всё
$_ = "Paris in the the the the spring."; #Удалить повторы слов s/ \b(\w+) \s (?= \1\b ) //gx;
За один проход.
Код: Выделить всё
l:
s/\b(\w+)(\s.*\b)\1/\1\2/
tl
Да ну?
/tmp/zsh - 1 (Created by format.vim)
(zyx:~/tmp/app-office:openoffice-3.0.0:20081221-185207.test) % time ( cat app-of
fice:openoffice-3.0.0:20081221-185207.log | perl -p -i -e 'undef $_ unless /(\/)
[^\/]*$/' >/dev/null )
(; cat app-office:openoffice-3.0.0:20081221-185207.log | perl -p -i -e > ; ) 0
,62s user 0,01s system 99% cpu 0,638 total
(zyx:~/tmp/app-office:openoffice-3.0.0:20081221-185207.test) % time ( cat app-of
fice:openoffice-3.0.0:20081221-185207.log | pcregrep '(/)[^/]*$' >/dev/null )
(; cat app-office:openoffice-3.0.0:20081221-185207.log | pcregrep '(/)[^/]*$')
0,43s user 0,02s system 99% cpu 0,453 total
(zyx:~/tmp/app-office:openoffice-3.0.0:20081221-185207.test) % time ( cat app-of
fice:openoffice-3.0.0:20081221-185207.log | egrep '(/)[^/]*$' >/dev/null )
(; cat app-office:openoffice-3.0.0:20081221-185207.log | egrep '(/)[^/]*$' > )
50,56s user 0,02s system 99% cpu 50,682 total
(zyx:~/tmp/app-office:openoffice-3.0.0:20081221-185207.test) % time ( cat app-of
fice:openoffice-3.0.0:20081221-185207.log | grep '\(/\)[^/]*$' >/dev/null )
(; cat app-office:openoffice-3.0.0:20081221-185207.log | grep --color=auto >)
50,03s user 0,14s system 99% cpu 50,266 total
(zyx:~/tmp/app-office:openoffice-3.0.0:20081221-185207.test) % time ( cat app-of
fice:openoffice-3.0.0:20081221-185207.log | sed '/\(\/\)[^\/]*$/ p' >/dev/null )
(; cat app-office:openoffice-3.0.0:20081221-185207.log | sed > /dev/null; ) 1,
98s user 0,03s system 99% cpu 2,016 total
Код: Выделить всё
time relative
pcregrep 0,43 1
perl 0,62 1,4
sed 1,98 4,6
grep 50,03 116
egrep 50,56 117
drBatty писал(а): ↑24.02.2011 10:34
Мне тоже попадались. Поначалу. Но когда я обнаружил, что в некоторых случаях быстродействие обратно пропорционально квадрату средней длинны строки, я уже стал думать... Я уже выше показал, что можно переписать выражение и на sed, только там этот цикл будет записан явно.
1) я вам уже 100500 раз говорил, что для корректности измерений нужно либо заставить sed работать с LC_ALL=C, либо перл заставить работать с utf-8.
Разумеется, у всех одни флаги компиляции и даже один компилятор: я всегда пересобираю мир после обновления оного.
Поэтому лучше брать perl/pcre, так как их синтаксис используется в большем количестве языков. Кроме того, ваше исходное утверждение было, что использование libc, например через sed, быстрее.drBatty писал(а): ↑24.02.2011 10:343) речь идёт о многопроходовых RE, очевидно, что будучи скомпилированы RE будут выполнятся быстрее, чем в интерпретаторе sed. Потому если задача предполагает предпросмотр, то конечно perl лучше. Но это только на примерах из вашей поваренной книге. На практике это редко нужно.
drBatty писал(а): ↑24.02.2011 10:344) я и не говорил, что "perl не нужен"
нужен. просто обратил внимание на то, что обсуждаемые RE на самом деле могут работать очень медленно, и этот глюк проявляется на больших наборах данных, а в тестах незаметен. Предложенный вариант на sed - лишь демонстрация того, что это возможно.
Shell
python3 -c $'import sys, re\nr=re.compile(\'(/)[^/]*$\')\nfor line in sys.stdin:\n if r.search(line) is not None:\n print(line[:-1])\n'
Код: Выделить всё
time relative
python 0,88 1
perl 1,21 1,375
sed 1,73 1,97
Относительно необходимости lookahead’ов можно почитать здесь: http://stackoverflow.com/questions/2974210...lar-expressions. Обычно lookahead мною используется либо если надо исключить часть строки из совпадения, либо если надо указать, чем не является некоторый символ. Без первого, в принципе, можно обойтись, а второе проистекает из недостатков регулярных выражений в Vim.