20 Nov 2013 00:44:22
Несколько полезных трюков в регулярных выражениях
Различные возможности и символьные конструкции, логические элементы- () - выделяет область в группу, то что будет находится внутри - инициализируется в переменную и будет доступно в перемемнной с порядковом номером - обычно $1, \1 Например у вас есть регулярное выражение
^(.*)(text)(.*)$
- в этом случае $1 = .* $2 = 'text' $3 = .* - () может также использоваться просто для группировки нескольких символов для использования квантификатора - например
(abc){3}
- будет равно abcabcabc и более раз, стоит отметить что здесь найденные значения также попадут в переменную $1, чтобы этого избежать - можно добавить вотпросительный знак двоеточее к группе - (?:) и тогда она не будет захватывать текст. - (?=)/(?<=) заглянуть вперед\назад, при этом не двигаясь по позиции относительно строки например есть строка 'car has good engine.' мы можем проверить есть ли символы после найденного значения:
^car (?=has).*$
даст совпадение, при этом конструкция (?=) не участвует ни в захвате символов ни в смещении курсора поиска, она лишь добавляет новое условие. С помощью таких конструкций можно создавать условия && (AND) - логическое И:
найдем строку с двумя латинскими буквами и с длинной не меньше 8 символов:^(?=.{8})(?=.*[A-z].*[A-z]).*$
- смысл таков - вначале анализатор смотрил есть ли 8 или больше любых символов с начала строки, если есть тогда точка поска возвращается в начало и проверяет есть ли среди текста две буквы, если есть отрабатывает основное регулрное выражение. - (?!) - инвертор - также заглядывает вперед как и предыдущая конструкция и проверят что там не встречается заданного шаблона - $text равный 'car is green'
^(?!car).*is green$
не даст совпадения, однако $text равный 'moto is green' найдется - | - логическое или (OR\||)
^car is (?:green|brown).*$
- (?if then | else ) - тернарные конструкции где if условие - then & else соответствено что будет выполнено при срабатывании условия и если оно не сработало, есть множетсов конструкций - одни из которых:
^(car.*)? i want buy (?(1)car|moto).*$
- после ? знака конструкция (1) говорит - успешно ли отработала первая группа - если да то будет искаться car в противном случае moto. Пример с html тегами(<div.*?>)?[^<]*(?(1)<\/div.*?>)
- если есть открывающий тег - будет искаться закрывающий, при этом отрицательное условие опущено и ничего происходить не будет если оно сработает - (?(?=)then|else) вы должно быть уже узнали конструкцию (?=) которая встречалась раньше - она работает точно также, только сейчас находится внутри тернарного выражения
- (?>) - атомарная группировка - она означает что найдется то мое, никому ничего не отдам. Пример - есть строка 'car is black' regexp
car.*
- совпадет с ней, с другой стороны .* тоже совпадет с ней - поскольку . любой символ и кванитификатор бесконечности все поглотит, но при добавлении слова car - .* уступает слова car из своей части, если же мы добавим атомарную группировкуcar(?>.*)
совпадения не произойдет поскольку .* поглотит car - и не будет его отдавать, для примера сработала бы така конструкция - строка 'carcar is green' regexpr:car(?>car is green)
Comments:
Pavel Ruban
11 мая 2013 в 18:23
/(\\[\\[asset:image:[0-9]+\\s\\{"mode":"small"(?:\\n|(?(?=(?!\\[\\[asset)).))*?\\}\\]\\])(?!(?=\\[\\[asset))(?(?=(?:\\s*?<br \\/>|\\n+\\s*?<br \\/>))(?:((?:\\s*?<\\s*?br\\s*?\\/\\s*?>\\s*?)+)|\\n)+)((?:[^<]|\\n)+?)</mu
аноним
24 сен 2015 в 06:03
I got this website from my pal who informed me on the topic <a href="http://tinyurl.com/nvbkrh8">plenty of fish dating site of free dating</a> this site and at the <br><br>
moment this time I am visiting this web site and reading very informative articles at this time.
аноним
25 сен 2015 в 10:04
I'm really impressed with your writing skills and also with the layout <br><br>
on your blog. Is this a paid theme or did you modify it yourself?<br><br>
<br><br>
Anyway keep up the excellent quality writing, it's rare to see a <br><br>
great blog like this one today.<br><br>
<br><br>
My weblog ... <a href="http://tinyurl.com/q5wcevh">plenty of fish dating site of free dating</a>
аноним
25 сен 2015 в 14:50
Asking questions are in fact pleasant thing <br><br>
if you are not understanding something totally, but this article offers pleasant understanding even.<br><br>
<br><br>
Visit my site - <a href="http://tinyurl.com/qeboy9k">plenty of fish dating site of free dating</a>