Синтаксис RE
RE определяет подстроку, поиск которой выполняется в тексте.
Символы в RE за исключением метасимволов [ ] \ ^ $ . | ? * + ( ) { } сопоставляются с такими же символами в обрабатываемом тексте. Например, RE abc может быть сопоставлено со строкой abc, но не с bac.
Для использования метасимволов в качестве обычных символов перед ними нужно ставить \. Обычный смысл в RE имеют последовательности \n (переход на новую строку) и \t (символ табуляции). После \ можно указать шестнадцатеричный (\x2A) код символа.
Назначение метасимволов
`x`|`y` – обозначает `x` или `y`. Например, RE one|two|three соответствует подстрокам one или two или three.
. – обозначает любой символ, кроме \n (с помощью опций можно включить и \n). Например, RE a.b может соответствовать подстроке aab или azb или a#b.
[ ] – обозначает, что в этом месте может быть любой из символов, указанных в [ ]. При этом можно задавать диапазоны символов, разделяя их символом - (минус). Например, RE [0-9a-fA-F] соответствует шестнадцатеричной цифре. Чтобы включить символ - в множество, нужно указать его сразу после [.
[^ ] – обозначает, что в этом месте может быть любой из символов, не указанных в [^ ]. Остальное аналогично предыдущему. Например, метасимвол . можно также записать как [^\n].
( ) – выделение подвыражения, с целью подчеркнуть порядок применения операций, указать дополнительные опции или выделения частей подстроки для последующей обработки. Нумерация подстрок идет по открывающимся скобкам слева направо, начиная с 1. Для группировки без дальнейшей обработки используется запись вида (?: ). В некоторых реализациях RE между ? и : можно указать опции (например, i для игнорирования регистра букв).
`x`* – обозначает последовательность из нуля или более повторений `x`. Например, RE a* соответствует пустой подстроке, подстрокам a, aa, aaa и т.д.
`x`+ – обозначает последовательность из одного или более повторений `x`. Например, RE a+ соответствует подстрокам a, aa, aaa и т.д.
`x`{`n`} – обозначает последовательность из `n` повторений `x`. Например, RE a{3} соответствует подстроке aaa.
`x`{`n`,} – обозначает последовательность из `n` или более повторений `x`.
`x`{`n`,`m`} – обозначает последовательность из от `n` до `m` повторений `x`.
`x`? – обозначает, что `x` может присутствовать или отсутствовать. Например, RE a? соответствует пустой подстроке или подстроке a.
Также символ ? используется для изменения поведения метасимволов + * {} и самого ?. По умолчанию при анализе текста выбирается наиболее длинный вариант, соответствующий повторению. При добавлении ? после + * } ? предпочтительнее становится более короткий вариант. Например, RE <.+> найдет в тексте "a<i>b</i>c" подстроку "<i>b</i>", а RE <.+?> подстроку "<i>".
Обозначения для классов символов
Некоторые часто используемые наборы символов имеют имена, указываемые в [: :]. Все названия наборов образованы от названий функций из ctype.h. Например, [:alnum:] – это набор из букв и цифр (0-9A-Za-z), [:digit:] – цифры, [:alpha:] – буквы, [:xdigit:] – шестнадцатеричные цифры. RE для шестнадцатеричной цифры можно записать так [[:xdigit:]].
\d – цифра [[:digit:]], \D – не цифра [^[:digit:]], \s – пробельный символ [[:space:]], \S – печатный символ [^[:space:]], \w – буква, цифра или символ подчеркивания [_[:alnum:]], \W – не буква, цифра или символ подчеркивания [^_[:alnum:]].
Для проверки границ используются следующие метасимволы и обозначения:
^ – соответствует началу строки (предыдущий символ это \n или начало текста).
$ – соответствует концу строки (следующий символ это \n или конец текста).
\b – граница слова (словом является непустая последовательность из букв, цифр и символов подчеркивания).
\B – не граница слова. Например, RE \bfor\b может быть использовано для поиска слова for, а RE \bfor\B – слова, начинающегося с for.
(?= ) – строка с текущей позиции соответствует RE без сдвига по строке, (?! ) – обратное условие. Например, RE (?=\w*?\d)\w+ соответствует непустой строке из букв, цифр и _, содержащей как минимум одну цифру.