Pull to refresh

Comments 40

О неужели, наконец-то я окончательно в них разберусь, спасибо большое, в закладки.
«Окончательно разобраться», в контексте регулярок, это — фантастика :)

джеффри фридл с книгой «регулярные выражения» для этого предназначен
вот только тираж был маловат. поэтому большинству она достанется в электронном виде ;)
была еще книжечка Бена Форта, попроще, но тоже может неплохо подсобить начинающим. тираж так же был плачевно мал…
Нормальные там тиражи. Полёживает себе в книжных… никому не нужна.
Можно ли одной строкой регекспов выбрать из стандартного лога вебсервера IP, которые запрашивают только один URL и больше никаких? У меня не получается, делаю в два прохода.
не уверен, но подумаю.
небольшая поправка
тк ip бывают 1.1.1.1 = 7символов и 254.168.222.215 = 15 символов, то регулярка будте немного другой
grep «my.cool.site.com/forum/advertisement/.....» access | egrep -o "^[0-9\.]{7,15}"
Можно сделать негативным просмотром вперед и назад, но будет нещадно тормозить.
Лучше брать список адресов и выкидывать повторяющиеся.

Плюс, если ловим ботов, то пара обращений в период ротации и адрес проскочит, а если фильтрануть по времени, то можно случайно зацепить нормального юзера.
это я вно задача не для регулярок. точнее теоретически можно решить ими, но лучше не пробовать.
лучше за один проход по всему логу выберите уникальные IP + счетчик обращений к уникальным урлам, потом выкинте всех у кого урлов было больше одного. это потребует гораздо меньше мощностей чем танцевать с вокург ОГРОМНОГО лога с регулярками.
Не только. Хорошо бы повнимательнее относиться к собственным текстам. Опечаток огромное количество, с мягкими знаками совсем беда:

"… пЕрсер каждый раз, видя варианты, ставитЬ так называемые..."
"… то парсер ее разложитЬ на два символа..."
"… можно в правой частЬ описать..."
Спасибо, то что нашел — исправил.
Глаз на текст мылится быстро :)
Да не за что. Спасибо вам за статью — хорошая.
UFO just landed and posted this here
это — хабрачитатель ;)
Это очень похоже на меня, когда в очередной раз врубаешся в то, почему рекэксп работает так как работает :)
UFO just landed and posted this here
Про жадность и производительность интересно.
вмемориз)
Wott, спасибо! Ты первый, кому удалось донести хоть немного понимания как работают регулярки в мою башку!
С нетерпением жду продолжения!
Ага и тебе привет!

Воспринимай регулярки как короткую запись условий в цикле. Я может быть еще в эту сторону копну, если руки дойдут в исходниках покопаться.

Продолжения будут, но как время появится, — эта статья где-то 3 полных дня.
На скриншотах — FF 3.5 c JS
labels = [
  /id="run_test"/,
  /id="\w+"/,
  /id=".*test"/,
  /id=".*.*test"/,
  /id="[^t]*test"/,
  /id=".{4}test"/,
  /id=".*?test"/,
  /id=".*u.*test"/
  ]
...

for (var j in labels) {
    
  timeStart=new Date();
  for(i=0;i<100000;i++) { str.search(labels[j]); }
  timeEnd=new Date();
  
  save_score(j,timeEnd.valueOf()-timeStart.valueOf());
}


* This source code was highlighted with Source Code Highlighter.
а мне больше нравится Expresso, но он для .NET-овских регулярок и с Javascriptэовскими имеет очень мало общего.
в нем и профайлер есть, поэтому тестировать можно прямо во время написания :")
JS имеет PCRE и четко прописан в стандарте.
Профайлер конечно хорошо, но без понятия что там наворотили в .NET.
Я в эклипсе пользуюсь плагином для Java.
в .NET все то же самое, но плюшек побольше. в принципе последние веяния в PCRE подтягивают кое-какие моменты до уровня .NETовской реализации, но к сожалению не все :(
Я бы сказал наоборот :) кроме именованных ссылок и классов символов остальное просто сплошное нарушение общепринятых стандартов.
Извеняюсь за оффтоп.
Кто-нибудь знает как написать рег. выражение которое находит все кавычки " кроме экранированных \".
/[^\\]?"/ тут по барабану на экранирование,
/[^\\]{1}"/ почти работает, но если 1й символ кавычка то ее не найдет :(
как-то неловко задача поставлена.

вместо того что написано можно использовать негативный просмотр назад /(?<!\\)"/, но сразу скажу что для \\" оно не сработает, хотя экранирован слэш. Что бы корректно отработать любое количество слэшей перед кавычками нужно просматривать вправо, что приводит нас к тому что условия задачи надо поменять.
вот такое решение придумал, оказывается все просто /([^\\\]{1}|^)\"/. спасибо за помощь.
Автор, есть к Вам пара вопросов :)
1. [^\"] — это Вы от какой неоднозначности пытаетесь уйти? Точнее — с ЧЕМ совпадет это конструкция?
2. Вам штакетник /(https?:\/\/|ftp:\/\/(\w+(:.+?)?@)?)([-a-z0-9]+\.)+[a-z]{2,4}/ мозг не выворачивает?
  Берете и m#((https?|ftp)://)?(\w+(:[^@]+)?@)?([-a-z0-9]+\.)+[a-z]{2,4}# его. Ну и правите мелкие промахи в плане.
1. Я вроде подробно описал.
Неоднозначность возникает если парсер не найдет простой кавычки и будет возвращаться обратно. Например в этом случае: "\" — строка не закрыта, выражение не должно на ней срабатывать.
Инструкция [^\"] совпадает со всем кроме \ и ". Кавычки экранированные покроются \. в выборе, также как и любые слеши, а неэкранированные — конец просмотра. Я не экранировал символы, что очевидно по абзацу.

2. Нет не выворачивает. И вообще при этом обычно скобки как (?: ) идут и так далее. Таковы уж регулярки.
К сожалению я все реже и реже пишу в перле, а другие языки таких конструкций не понимают. Иногда приходиться работать с двойным штакетником, поскольку в строке слеши приходиться экранировать дважды. А в некоторых нотациях все метасимволы идут со слешами и ничё! :)

Да пароль так лучше выглядит.
2. Ну, есть обычно варианты забодать синтаксис как-нибудь витиевато.

1. /"(\\.|[^\\"])*"/ — хоть убейте понять не могу, какую строку мы парсим. Давайте с примером — правильным и неправильным.
«текст\»еще\«текст\n новая строка \\ после слеша» — покрывает
«незаконченная строка \» — не покрывает
сорри, так лучше:
"текст\"еще\"текст\n новая строка \\ после слеша" - покрывает
"незаконченная строка \" - не покрывает
Про тонкости multiline жду с нетерпением.
Спасибо за разъяснения. В качестве пожеланий — можно приводить чуть больше примеров из жизни, чтобы получился небольшой cook book? Хотя, возможно, это тема для отдельного поста.
Специфика регулярных выражений в том что они пишутся для конкретных случаев, поэтому собирать регулярки в некий Cook book чревато ошибочным применением. Для популярных применений типа полного URL или e-mail есть в сети корректные варианты, но они все равно нуждаются в коррекции для используемого диалекта.
UFO just landed and posted this here
Sign up to leave a comment.

Articles