Регулярные выражения
Введение
Регулярные выражения - широко используемый метод определения шаблонов текста для поиска. Специальные метасимволы позволяют указать, например, конкретную строку, которую вы ищете, в начале или конце строки или содержат 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', и т.д.
Если вы хотите, чтобы «-» сам был членом класса, поместите его в начало или конец списка или перед ним с обратной косой чертой.
Если вы хотите ']', вы можете поместить его в начале списка или перед ним с обратной косой чертой.
Примеры:
[-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 (без кавычек) и т.д.