Регулярные выражения

Введение

Регулярные выражения - широко используемый метод определения шаблонов текста для поиска. Специальные метасимволы позволяют указать, например, конкретную строку, которую вы ищете, в начале или конце строки или содержат n повторений определенного символа.

Простые соответствия

Любой отдельный символ соответствует самому себе, если только он не является метасимволом со специальным значением, описанным ниже. Ряд символов соответствует этой серии символов в целевой строке, поэтому шаблон «short» будет соответствовать «short» в целевой строке. Вы можете вызвать символы, которые обычно функционируют как метасимволы или escape-последовательности, которые должны интерпретироваться перед ними с помощью обратного слэша «\».
Например, метасимвол «^» соответствует началу строки, но «\ ^» соответствует символу «^», а «\\» соответствует «\» и т. д.


Примеры :

    unsigned соответствует строке 'unsigned'
    \^unsigned соответствует строке '^unsigned'

Эквивалентные последовательности

Символы могут быть указаны с помощью escape-последовательностей: «\ n» соответствует новой строке, «\ t» вкладке и т. д. В более общем плане, \ xnn, где nn - это строка шестнадцатеричных цифр, соответствует символу, значение ASCII которого равно nn.
Если вам нужен широкий (Unicode) код символа, вы можете использовать «\ x {nnnn}», где «nnnn» - одна или несколько шестнадцатеричных цифр.

    \xnn - char с hex code nn
    \x{nnnn)- char с hex code nnnn (один байт для обычного текста и два байта для Unicode)
    \t - tab (HT/TAB), то же, что и \x09
    \n - newline (NL), то же, что и \x0a
    \r - car.return (CR), то же, что и \x0d
    \f - form feed (FF), то же, что и \x0c
    \a - alarm (bell) (BEL), то же, что и \x07
    \e - escape (ESC) , то же, что и \x1b

Примеры:

    unsigned\x20int соответствует 'unsigned int' (обратите внимание на пробел в середине)
    \tunsigned соответствует 'unsigned' (предваренное символом табуляции)

Классы символов

Вы можете указать класс символов, введя список символов в [], который будет соответствовать любому из символов из списка. Если первый символ после «[» равен «^», класс соответствует любому символу, не входящему в список.

Примеры:

    count[aeiou]r находит строки 'countar', 'counter', и т.д., но не 'countbr', 'countcr', и т.д.
    count[^aeiou]r находит строки 'countbr', 'countcr', и т.д., но не 'countar', 'counter', и т.д.
Внутри списка символ «-» используется для указания диапазона, так что a-z представляет все символы между «a» и «z» включительно.

Если вы хотите, чтобы «-» сам был членом класса, поместите его в начало или конец списка или перед ним с обратной косой чертой.
Если вы хотите ']', вы можете поместить его в начале списка или перед ним с обратной косой чертой.

Примеры:

    [-az] соответствует 'a', 'z' и '-'
    [az-] соответствует 'a', 'z' и '-'
    [a\-z] соответствует 'a', 'z' и '-'
    [a-z] соответствует все двадцать шесть маленьких символов из 'a' до 'z'
    [\n-\x0D] соответствуетлюбому из #10,#11,#12,#13.
    [\d-t] соответствует любой цифре '-' или 't'.
    []-a] соответствует любому символу от ']'..'a'.

Метасимволы

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

Метасимволы - разделители строк

    ^ - начало строки
    $ - конец строки
    \A - начало текста
    \Z - конец текста
    . - любой символ в строке

Примеры:

    ^GPIO_PORTA - соответствует строке ' GPIO_PORTA ' только если он находится в начале строки
    GPIO_PORTA$ - соответствует строке ' GPIO_PORTA ' только если он находится в конце строки
    ^GPIO_PORTA$ - соответствует строке ' GPIO_PORTA ' только если это единственная строка в строке
    PORT.r - соответствует таким строкам, как 'GPIO_PORTA', 'GPIO_PORTB', 'PORT1' и так далее

Метафактор «^» по умолчанию гарантирован только для соответствия началу входной строки / текста и метасимволу «$» только в конце. Встраиваемые разделители строк не будут сопоставляться символами ^ "или" $ ".
Однако вы можете рассматривать строку как многострочный буфер, так что «^» будет соответствовать после любого разделителя строк внутри строки, а «$» будет соответствовать перед любым разделителем строк.
Регулярные выражения работают с разделителями строк, как то рекомендовано в
http://www.unicode.org/unicode/reports/tr18/

Metacharacters - Predefined classes

    \w - буквенно-цифровой символ (включая «_»)
    \W - небуквенно-цифровой символ
    \d - числовой символ
    \D - нечисловой символ
    \s - любое пространство (то же, что и [\ t \ n \ r \ f])
    \S - не пробел

Вы можете использовать \ w, \ d и \ s в пользовательских классах символов.

Пример:
    routi\de - соответствует таким строкам, как 'routi1e', 'routi6e' и так далее, но не 'routine', 'routime' и так далее.

Метасимволы - границы слова

Граница слова («\ b») - это пятно между двумя символами с буквенно-цифровым символом («\ w») с одной стороны и неальфанумерным символом («\ W») с другой стороны (в любом порядке), считая воображаемые символы с начала и конца строки, как совпадающие с «\ W».

    \b - соответствует границе слова
    \B -совпадают с не (границей слова)

Метасимволы - Итераторы

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

    * - ноль или более («жадный»), аналогичный {0,}
    + - один или несколько («жадный»), похожий на {1,}
    ? - ноль или один («жадный»), похожий на {0,1}
    {n} - ровно n раз («жадный»)
    {n,} - по крайней мере n раз («жадный»)
    {n,m} - по крайней мере n, но не более чем в два раза («жадный»)
    *? - ноль или более («нежадный»), похожие на {0,}?
    +? - один или несколько («нежадный»), похожие на {1,}?
    ?? - ноль или один («нежадный»), похожий на {0,1}?
    {n}? - ровно n раз («нежадный»)
    {n,}? - по крайней мере, в n раз («нежадный»)
    {n,m}? - по крайней мере n, но не более m раз («нежадный»)

Итак, цифры в фигурных скобках формы, {n, m}, задают минимальное количество раз, чтобы соответствовать элементу n и максимальному m. Форма {n} эквивалентна {n, n} и соответствует ровно n раз. Форма {n,} соответствует n или более раз. Нет ограничений на размер n или m, но большие числа будут пережевывать больше памяти и замедлять выполнение.

Если фигурная скобка встречается в любом другом контексте, она рассматривается как обычный символ.

Примеры:
    count.*r ß- соответствует таким строкам, как 'counter', 'countelkjdflkj9r' и 'countr'
    count.+r - соответствует таким строкам, как 'counter', 'countelkjdflkj9r', но не 'countr'
    count.?r - соответствует таким строкам, как 'counter', 'countar' and 'countr', но не 'countelkj9r'
    counte{2}r - соответствует строке 'counteer'
    counte{2,}r - соответствует таким строкам, как 'counteer', 'counteeer', 'counteeer' и т.п..
    counte{2,3}r - соответствует таким строкам, как 'counteer', or 'counteeer' , но не 'counteeeer'

Небольшое объяснение о «жадности». «Жадный» берет как можно больше, «не жадный» занимает как можно меньше.
Например, 'b +' и 'b *' применяются к строке 'abbbbc' return 'bbbb', 'b +?' возвращает 'b', 'b *?' возвращает пустую строку, 'b {2,3}?' возвращает 'bb', 'b {2,3}' возвращает 'bbb'.

Метасимволы - Альтернативы

Вы можете указать ряд альтернатив для шаблона, используя «|» для того чтобы их разбить, так что бит | bat | bot будет соответствовать любому из «бит», «летучая мышь» или «бот» в целевой строке, как «b (i | a | o) t)». Первая альтернатива включает в себя все, начиная с последнего разделителя шаблонов («(», «[» или начало шаблона) до первого «|», а последняя альтернатива содержит все от последнего «|» до следующего шаблона По этой причине в круглые скобки принято включать альтернативы, чтобы свести к минимуму путаницу в отношении того, где они начинаются и заканчиваются.

Альтернативы проверяются слева направо, поэтому первая альтернатива, для которой соответствует все выражение, является выбрана. Это означает, что альтернативы не обязательно жадные. Например: при сопоставлении rou | route с «подпрограммой» будет соответствовать только часть «rou», поскольку это первая альтернативная попытка, и она успешно соответствует целевой строке (это может показаться неважным, но важно, когда вы захватывают согласованный текст, используя круглые скобки.) Также помните, что «|» интерпретируется как буква в квадратных скобках, поэтому, если вы пишете [бит | bat | bot], вы действительно соответствуете [biao |].

Примеры:
    rou(tine|te) - соответствует строкам 'routine' или 'route'.

Метасимволы - Подвыражения

Конструкция брекетинга (...) также может использоваться для определения регулярных подвыражений. Подвыражения нумеруются в соответствии с порядком их открытия влево-вправо. Первое подвыражение имеет номер '1'

Примеры:
    (int){8,10} соответствует таким строкам, которые содержат 8, 9 или 10 экземпляров 'int'
    routi([0-9]|a+)e соответствует 'routi0e', 'routi1e' , 'routine', 'routinne', 'routinnne' и т.п..

Метасимволы - обратные ссылки

Метасимволы от 1 до 9 интерпретируются как обратные ссылки. \ соответствует ранее согласованное подвыражение #.

Примеры:
    (.)\1+ соответствует 'aaaa' и 'cc'.
    (.+)\1+ соответствует 'abab' и '123123'
    (['"]?)(\d+)\1 соответствует "13" (в двойных кавычках), или '4' (в одинарных кавычках) или 77 (без кавычек) и т.д.