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