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:

аноним
Место для вашего спама
21 апр 2013 в 13:45
аноним
нет ничего ужасней регулярных выражений :(
22 апр 2013 в 12:13
Pavel Ruban
/(\\[\\[asset:image:[0-9]+\\s\\{"mode":"small"(?:\\n|(?(?=(?!\\[\\[asset)).))*?\\}\\]\\])(?!(?=\\[\\[asset))(?(?=(?:\\s*?<br \\/>|\\n+\\s*?<br \\/>))(?:((?:\\s*?<\\s*?br\\s*?\\/\\s*?>\\s*?)+)|\\n)+)((?:[^<]|\\n)+?)</mu
11 май 2013 в 18:23
rubanovich
АБРУБАГАБУ
28 авг 2013 в 20:42
аноним
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 в 10:04

add comment