Синтаксис регулярных выражений почти полностью совпадает с перловыми регэкспами.
Общий вид: regexp или /regexp/options.
Опции (options):
i - игнорировать регистр.
s - рассматривать текст как одну строку, '.' совпадает с абсолютно любым знаком.
m - рассматривать текст как много строк. ^ и $ совпадают с началом и концом
любой "внутренней" строки.
x - просто пробельные знаки (без обратного слеша впереди) игнорируются -
полезно в сложных выражениях для структуризации.
regexp - последовательность знаков и метасимволов. К знакам относятся буквы и цифры, всё остальное, если и не является метасимволом, может им стать, поэтому всё, что не есть буква и не есть цифра, следует делать знаком "насильственно". Для этого надо перед ним поставить обратный слеш - \.
Обратите внимание на то, что все слеши (и прямые, и обратные) в вашем регулярном выражении должны писаться со спецсимволом \ впереди, чтобы не быть спутанными с другими спецсимволами или концом выражения. Пример: строка "большое\белое/страшное" в виде регулярного выражения должна выглядеть так - "большое\белое\/страшное".
\ | Следующий за ним знак будет рассмотрен именно как знак, а не как метасимвол. |
^ | Начало строки. |
$ | Конец строки. |
| | Альтернатива. Должно совпасть выражение до или после |. Пример: "\d+\w+|Hello\d+" работает как "(\d+\w+)|(Hello\d+)", а не как "\d+(\w+|H)ello\d+". |
() | Группировка - группировка служит либо для использования
"ссылок", либо для использования попавшего в скобку фрагмента текста при замене. Кроме группировки круглые скобки служат ещё для следующих операций: (?:pattern) - обычная группировка, но только эта скобка не получает "номера". (?=pattern) - просмотр вперёд. Совпадение продолжится с того же места, но только если pattern в этой скобке совпал. Например, \w+(?=\s) совпадёт со словом, за которым идёт пробел, причём пробел не будет включён в результат поиска. (?!pattern) - отрицание просмотра вперёд. Совпадение продолжится с того же места, если pattern НЕ совпадёт. Например, foo(?!bar) совпадёт с любым вхождением "foo", которое встречается без последующего "bar". Помните, что это выражение имеет нулевой размер, что означает, что a(?!b)d совпадёт с ad, потому что a сопровождается знаком, который не b (а d), а d идёт за выражением нулевого размера. (?<=pattern) - просмотр назад. К сожалению, pattern должен быть фиксированной длины. (?<!pattern) - отрицание просмотра назад. Те же ограничения, что и для просмотра назад. |
[] | Класс знаков - это метасимвол который совпадёт с любым из перечисленных в [] знаком или диапазоном знаков. Диапазоны указываются например так: [a-z] Метасимволы не учитываются в классах символов. Если первый знак класса - ^, то это делается негативный класс. Если хочется добавить в класс знак ^, он либо не должен быть первым, либо перед ним должен быть \. |
За любым знаком, группой или классом знаков может идти один из квантификаторов:
? | - жадное совпадение 0 или один раз. |
?? | - нежадное совпадение 0 или один раз. |
* | - жадное совпадение 0 или более раз. |
*? | - нежадное совпадение 0 или более раз. |
+ | - жадное совпадение 1 или более раз. |
+? | - нежадное совпадение 1 или более раз. |
{n} | - совпадение точно n раз. |
{n,} | - жадное совпадение n или более раз. |
{n,}? | - нежадное совпадение n или более раз. |
{n,m} | - жадное совпадение не меньше чем n, но не больше чем m раз. |
{n,m}? | - нежадное совпадение не меньше чем n, но не больше чем m раз. |
{,m} | - эквивалентно {0,m}. |
{,m}? | - эквивалентно {0,m}?. |
Что такое "жадный" и "нежадный" квантификатор?
Жадный квантификатор захватывает как можно больше. И только, если дальнейшего совпадения не получилось, "отдаёт" захваченное (происходит "откат", не самая "дешёвая" операция).
Если выражение "A.*Z" сопоставить строке "AZXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", то ".*" сначала захватит всю строку, а потом будет по одному знаку "откатываться" пока не найдёт Z. А если выражение будет "A.*?Z" то Z найдётся сразу же. Нежадный квантификатор ещё называют минимизирующим, он захватывает минимально возможное количество знаков, и только, если дальнейшее совпадение не получилось, захватывает ещё.
Перед небуквой и нецифрой можно в большинстве случаев ставить знак \, а для букв и цифр это делать нужно осторожно, ибо таким образом обозначаются спецсимволы:
. | - любой знак, кроме перевода строки. Если среди опций есть s, то вообще любой знак. |
\t | - tab (0x09) |
\n | - new line (lf, 0x0a) |
\r | - return (cr, 0x0d) |
\f | - form feed (0x0c) |
\a | - bell (0x07) |
\e | - escape (0x1b) |
\xNNNN | - hex char, где N - [0-9A-Fa-f]. |
\Q | - начало квотирования метасимволов - всё, что квотируется, будет обрабатываться как текст, а не как регулярное выражение. |
\E | - конец квотирования метасимволов. |
\w | - буква, цифра или '_'. |
\W | - не \w. |
\s | - знак пробела (tab/space/lf/cr). |
\S | - не \s. |
\d | - цифра. |
\D | - не цифра. |
\i | - буква. |
\I | - не буква |
\l | - знак в нижнем регистре |
\L | - не знак в нижнем регистре |
\u | - знак в верхнем регистре |
\U | - не знак в верхнем регистре |
\b | - граница слова - означает, что слева или справа от текущей позиции находится знак из "слова", а справа или слева, соответственно, из "не слова" |
\B | - не \b |
\A | - начало текста, независимо от опции m |
\Z | - конец текста, независимо от опции m |
\O | - точка "невозврата". Если при матчинге пройден этот знак,
то отката назад не будет, сразу выдаст no match. Можно
использовать в сложном выражении после обязательного
фрагмента с квантификатором. Этот спецсимвол можно
использовать, когда обрабатываемые объёмы данных очень большие. Пример: /.*?name\O=(['"])(.*?)\1\O.*?value\O=(['"])(.*?)\3/ Строки, в которых есть "name=", но нет "value=", будут обрабатываться (фактически - пропускаться) быстрее. |
\NN | - ссылка на ранее совпавшую скобку. NN - целое число
от 0 до 15. Каждая скобка кроме (?:pattern), (?=pattern),
(?!pattern), (?<=pattern) и (?<!pattern)
имеет номер (по порядку появления открывающей скобки). Пример: "(['"])hello\1" совпадёт с "hello" или 'hello'. |
/foobar/ совпадёт с "foobar", но не с "FOOBAR".
/ FOO bar /ix совпадёт с "foobar" и с "FOOBAR".
/(foo)?bar/ совпадёт с "foobar" и "bar".
/^foobar$/ совпадёт _только_ с "foobar", но не с "foofoofoobarfoobar".
/[\d\.]+/ совпадёт с любым числом с десятичной точкой.
/(foo|bar)+/ совпадёт с "foofoofoobarfoobar" и "bar".
/\Q.)))$\E/ эквивалентно "\.\)\)\)\$".
В строке замены помимо обычных знаков вы можете использовать специальные операторы - регулярные выражения для строки замены.
Номера найденных групп. Соответствующая группа подставляется в строку во время работы. Номера группам присваиваются в порядке следования открывающих скобок в регулярном выражении.
$0 означает всю найденную последовательность целиком. $* заменяется на символ *.