Регулярное выражение -Синтаксис

Регулярное выражение — это мощный инструмент для сопоставления и обработки текста. Оно состоит из обычных символов и специальных символов (называемых "метасимволами") и используется для описания текстовых шаблонов, которые нужно сопоставить.

Регулярные выражения можно использовать для поиска, замены, извлечения и проверки конкретных шаблонов в тексте.

Например:

  • runoo+b, может соответствоватьпример、runooob、runoooooobи т. д.,+Знак указывает, что предшествующий символ должен встречаться как минимум один раз (1 или более раз)。

  • runoo*b, может соответствоватьrunob、пример、runoooooobи т. д.,*Знак указывает, что предшествующий символ может отсутствовать или появляться один или несколько раз (0 раз, или 1 раз, или несколько раз)。

  • colou?rможет соответствоватьcolorилиcolour,?Вопросительный знак указывает, что предшествующий символ может встречаться не более одного раза (0 или 1 раз)。

Метод построения регулярных выражений такой же, как создание математических выражений — комбинируя небольшие выражения с различными метасимволами и операторами, можно создавать более крупные выражения. Компонентами регулярного выражения могут быть отдельный символ, набор символов, диапазон символов, выбор между символами или любая комбинация всех этих компонентов.

Как шаблон, регулярное выражение сопоставляет определённый шаблон символов с искомой строкой.


Обычные символы

Обычные символы включают все печатные и непечатаемые символы, которые явно не обозначены как метасимволы, включая все прописные и строчные буквы, все цифры, все знаки пунктуации и некоторые другие символы.

Символ Описание Пример
[ABC]

Соответствует[...]всем символам, перечисленным в .... Например,[aeiou]Соответствует всем буквам e, o, u и a в строке "google example taobao".

[^ABC]

Соответствует всем символам, кроме[...]всех символов, отличных от тех, что в .... Например,[^aeiou]Соответствует всем символам в строке "google example taobao", кроме букв e, o, u и a.

[A-Z]

[A-Z] обозначает диапазон и соответствует всем заглавным буквам; [a-z] соответствует всем строчным буквам; [0-9] соответствует всем цифрам.

.

Соответствует любому одиночному символу, кроме символов новой строки (\n, \r), эквивалентно [^\n\r].

[\s\S]

Соответствует всем символам (включая символы новой строки).\sСоответствует всем пробельным символам (включая переводы строк),\SСоответствует всем непробельным символам (исключая переводы строк); их сочетание может соответствовать любому символу.

\w

Соответствует буквам, цифрам и знакам подчёркивания, эквивалентно [A-Za-z0-9_].

\d

Соответствует любой арабской цифре (от 0 до 9), эквивалентно[0-9]。

Инструменты тестирования

Модификаторы:

[0-9]+

Совпадение текста:

123abc456edf789

Непечатаемые символы

Непечатаемые символы также могут быть компонентами регулярных выражений. В следующей таблице перечислены escape-последовательности, которые представляют непечатаемые символы:

Символ Описание
\cx Соответствует управляющему символу, обозначенному x. Например, \cM соответствует Control-M или возврату каретки. Значение x должно быть одним из A-Z или a-z; в противном случае c рассматривается как литеральный символ 'c'.
\f Соответствует символу перевода страницы, эквивалентен \x0c и \cL.
\n Соответствует символу новой строки, эквивалентен \x0a и \cJ.
\r Соответствует символу возврата каретки, эквивалентен \x0d и \cM.
\s Соответствует любому пробельному символу, включая пробел, табуляцию, перевод страницы и т. д., эквивалентен [ \f\n\r\t\v]. Обратите внимание, что регулярные выражения Unicode также соответствуют полноширинным пробельным символам.
\S Соответствует любому непробельному символу, эквивалентен [^ \f\n\r\t\v].
\t Соответствует символу табуляции, эквивалентен \x09 и \cI.
\v Соответствует символу вертикальной табуляции, эквивалентен \x0b и \cK.

Специальные символы

Так называемые специальные символы — это символы с особым значением, например упомянутый вышеrunoo*bв*, означающий "любое количество символов".*Если вы хотите найти ... в строке*сам символ, то необходимо\экранировать его, добавив обратную косую черту перед нимruno\*ob, то естьruno*ob。

соответствует строке\перед ними. В следующей таблице перечислены специальные символы в регулярных выражениях:

Специальные символы Описание
$ Соответствует конечной позиции входной строки. Если установлено свойство Multiline объекта RegExp, $ также соответствует '\n' или '\r'. Чтобы сопоставить сам символ $, используйте \$.
( ) Отмечает начальную и конечную позиции подвыражения. Подвыражение можно захватить для последующего использования. Чтобы сопоставить эти символы, используйте \( и \).
* Соответствует предыдущему подвыражению ноль или более раз. Чтобы сопоставить сам символ *, используйте \*.
+ Соответствует предыдущему подвыражению один или более раз. Чтобы сопоставить сам символ +, используйте \+.
. Соответствует любому одиночному символу, кроме символа новой строки \n. Чтобы сопоставить сам символ ., используйте \.
[ Обозначает начало выражения в квадратных скобках. Чтобы сопоставить [, используйте \[.
? Соответствует предыдущему подвыражению ноль или один раз или обозначает нежадный квантификатор. Чтобы сопоставить сам символ ?, используйте \?.
\ Помечает следующий символ как специальный символ, литерал, обратную ссылку или восьмеричную escape-последовательность. Например, 'n' соответствует символу 'n'; '\n' соответствует новой строке; '\\' соответствует "\"; '\(' соответствует "(".
^ Соответствует начальной позиции входной строки. При использовании в выражении в квадратных скобках указывает, что набор символов внутри скобок не принимается (отрицание). Чтобы сопоставить сам символ ^, используйте \^.
{ Обозначает начало выражения квантификатора. Чтобы сопоставить {, используйте \{.
| Указывает на выбор между двумя элементами. Чтобы сопоставить |, используйте \|.

Квантификаторы

Квантификаторы определяют, сколько раз заданный компонент регулярного выражения должен появиться для успешного сопоставления. Всего существует*、+、?、{n}、{n,}、{n,m}6 типов.

Символ Описание Пример
* Соответствует предыдущему подвыражению ноль или более раз. Например,zo*может соответствовать"z"и"zoo"。*эквивалентно{0,}。 Попробуйте »
+ Соответствует предыдущему подвыражению один или более раз. Например,zo+может соответствовать"zo"и"zoo", но не может соответствовать"z"。+эквивалентно{1,}。 Попробуйте »
?

Соответствует предшествующему подвыражению ноль или один раз. Например,do(es)?может соответствовать"do"и"does", но не может соответствовать"dog"。?эквивалентно{0,1}。

Попробуйте »
{n} n — неотрицательное целое число, соответствует ровно n раз. Например,o{2}не может соответствовать"Bob"букве o в ..., но может соответствовать"food"двум буквам o в ... Попробуйте »
{n,} n — неотрицательное целое число, соответствует как минимум n раз. Например,o{2,}не может соответствовать"Bob"букве o в ..., но может соответствовать"foooood"всем буквам o в ...o{1,}эквивалентноo+,o{0,}эквивалентноo*。 Попробуйте »
{n,m} m и n — оба неотрицательные целые числа, где n <= m. Соответствует не менее n раз и не более m раз. Например,o{1,3}будет соответствовать"fooooood"первым трём буквам o в ...o{0,1}эквивалентноo?. Примечание: между запятой и двумя числами не должно быть пробела. Попробуйте »

Следующее регулярное выражение соответствует положительному целому числу,[1-9]гарантирует, что первая цифра не 0,[0-9]*обозначает любое количество цифр:

/[1-9][0-9]*/

Обратите внимание, что квантификатор идёт после выражения диапазона, поэтому он применяется ко всему выражению диапазона, которое в данном случае задаёт только цифры от 0 до 9 (включая 0 и 9).

Квантификатор + здесь не используется, потому что цифра не обязательно требуется на второй или последующих позициях. Символ ? также не используется, поскольку использование ? ограничило бы целое число только двумя цифрами.

Если вы хотите сопоставлять двузначные числа от 0 до 99, можно использовать следующее выражение, чтобы указать не менее одной цифры и не более двух цифр:

/[0-9]{1,2}/

У приведённого выше выражения есть недостаток: оно может сопоставляться только с числами в пределах двух цифр и будет сопоставляться с неожиданными значениями, такими как 0 и 00. После улучшения выражение для сопоставления положительных целых чисел от 1 до 99 выглядит так:

/[1-9][0-9]?/

или

/[1-9][0-9]{0,1}/

*и+Квантификаторы жадные, потому что они сопоставляют как можно больше текста. Добавьте?после них, чтобы получить нежадное или минимальное сопоставление.

Например, вы можете искать в HTML-документе содержимое внутри тегов h1. HTML-код выглядит так:

&lt;h1&gt;EXAMPLE-Example&lt;/h1&gt;

Жадный режим:Следующее выражение сопоставляет всё между открывающим знаком «меньше» (<) и закрывающим знаком «больше» (>) тега h1:

/&lt;.*&gt;/

Нежадный режим:Если вам нужно сопоставить только открывающий и закрывающий теги h1, следующее нежадное выражение сопоставляет только <h1>:

/&lt;.*?&gt;/

Вы также можете использовать следующее регулярное выражение для сопоставления тегов h1:

/&lt;\w+?&gt;/

Поместив*、+или?после квантификатора?, выражение меняется с «жадного» на «нежадное» (минимальное сопоставление).


Якоря

Якоря позволяют привязать регулярное выражение к началу или концу строки, а также описывать граничные позиции слова.

^и$обозначают соответственно начало и конец строки.\bописывают начальную или конечную границу слова,\Bобозначает границу, не являющуюся границей слова.

Символ Описание Пример
^ Соответствует началу входной строки. Если свойство Multiline объекта RegExp установлено, ^ также соответствует позициям после \n или \r. Попробуйте »
$ Соответствует концу входной строки. Если свойство Multiline объекта RegExp установлено, $ также соответствует позициям перед \n или \r. Попробуйте »
\b Соответствует границе слова, т. е. позиции между словом и пробелом. Попробуйте »
\B Соответствует негранице слова, т. е. позиции, которая не находится в начале или конце слова. Попробуйте »

Примечание:Кванторы нельзя использовать вместе с якорями. Поскольку не может быть более одной позиции непосредственно перед или после разрыва строки или границы слова, выражения, такие как^*, не допускаются.

Чтобы сопоставить текст в начале строки текста, используйте^символ в начале регулярного выражения. Будьте осторожны, чтобы не^спутать это использование с использованием отрицания внутри выражений в квадратных скобках.

Чтобы сопоставить конец строки текста, используйте$символ в конце регулярного выражения.

Чтобы использовать якоря при поиске заголовков разделов, следующее регулярное выражение соответствует заголовку раздела, который содержит только две цифры в конце и находится в начале строки:

/^Chapter [1-9][0-9]{0,1}/

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

/^Chapter [1-9][0-9]{0,1}$/

Границы слов могут точно управлять областью сопоставления. Следующее выражение соответствует первым трём символам слова Chapter, потому что эти три символа находятся после границы слова:

/\bCha/

\bПозиция очень важна: когда она находится в начале строки, она находит совпадение в начале слова; когда в конце строки — в конце слова. Например, следующее выражение соответствует строке ter в слове Chapter, потому что она находится перед границей слова:

/ter\b/

Следующее выражение соответствует строке apt в Chapter, но не соответствует apt в aptitude:

/\Bapt/

Строка apt встречается на несловесной границе в слове Chapter, но встречается на границе слова в слове aptitude. Для оператора\Bнесловесной границы он не может совпадать с началом или концом слова, поэтому следующее выражение не совпадает с Cha в Chapter:

/\BCha/

Чередование

Используйте круглые скобки()чтобы заключить все альтернативы, а соседние альтернативы разделяйте с помощью||.

()Обозначает захватывающую группу,()которая сохраняет совпавшее значение в каждой группе. Несколько совпавших значений можно просмотреть с помощью номера n (n — цифра, обозначающая содержимое n-й захватывающей группы).

Использование круглых скобок имеет побочный эффект: связанное совпавшее содержимое будет кэшировано (захвачено). Если захват не нужен, вы можете использовать?:перед первой альтернативой, чтобы устранить этот побочный эффект. В этом случае круглые скобки используются только для группировки и не сохраняют совпавшее содержимое.

Где?:является одним из незахватывающих метасимволов, а два других незахватывающих метасимвола — это?=и?!: первый — положительный просмотр вперёд, который совпадает с искомой строкой в любой позиции, где шаблон регулярного выражения внутри круглых скобок начинает совпадать; второй — отрицательный просмотр вперёд, который совпадает с искомой строкой в любой позиции, где этот шаблон регулярного выражения не начинает совпадать.

Различия в использовании ?=, ?<=, ?!, ?<!

exp1(?=exp2): Найти exp1 перед exp2 (положительный просмотр вперёд).

(?<=exp2)exp1: Найти exp1 после exp2 (положительный просмотр назад).

exp1(?!exp2): Найти exp1, за которым не следует exp2 (отрицательный просмотр вперёд).

(?<!exp2)exp1: Найти exp1, перед которым не стоит exp2 (отрицательный просмотр назад).

Дополнительную информацию см.:Утверждения просмотра вперёд и назад в регулярных выражениях


Обратные ссылки

Добавление круглых скобок вокруг шаблона регулярного выражения или части шаблона приводит к тому, что соответствующее совпадение сохраняется во временном буфере. Каждое захваченное подсовпадение сохраняется в том порядке, в котором оно появляется слева направо в шаблоне регулярного выражения. Номера буферов начинаются с 1, и можно сохранить до 99 захваченных подвыражений. К каждому буферу можно обратиться с помощью\nгде n — однозначное или двузначное десятичное число, которое идентифицирует конкретный буфер.

Вы можете использовать незахватывающий метасимвол?:、?=или?!чтобы переписать захват, игнорируя сохранение связанного совпадения.

Одно из самых простых и полезных применений обратных ссылок — поиск двух одинаковых соседних слов в тексте. Возьмём следующее предложение в качестве примера:

Is is the cost of of gasoline going up up?

Приведённое выше предложение содержит несколько повторяющихся слов. Следующее регулярное выражение использует одно подвыражение для поиска этих дубликатов:

Пример

Найти повторяющиеся слова:

var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/igm;
document.write(str.match(patt1));

Попробуйте »

Захваченное выражение[a-z]+совпадает с одной или несколькими буквами. Вторая часть регулярного выражения\1является обратной ссылкой на первое подсовпадение (содержимое, захваченное в круглых скобках), которая требует, чтобы сразу после него следовало то же слово, что и первое слово.

Метасимвол границы слова\bгарантирует, что обнаруживаются только целые слова; в противном случае такие фразы, как "is issued" или "this is", не будут правильно идентифицированы.

В конце выражения флагg(global) указывает, что выражение применяется ко всем совпадениям, найденным во входной строке; флагi(ignore case) задаёт сопоставление без учёта регистра;mФлаг (multiline) указывает, что потенциальные совпадения могут появляться по обе стороны от разрыва строки.

Обратные ссылки также могут разбить URI на компоненты. Предположим, вы хотите разбить следующий URI на протокол (ftp, http и т. д.), адрес домена и путь:

https://www.example.com:80/html/html-tutorial.html

Следующее регулярное выражение обеспечивает эту функциональность:

Пример

Вывести все совпавшие данные:

var str = "https://www.example.com:80/html/html-tutorial.html";
var patt1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/;
arr = str.match(patt1);
for (var i = 0; i < arr.length; i++) {
    document.write(arr[i]);
    document.write("<br>");
}

Попробуйте »

str.match(patt1)Возвращает массив из 5 элементов: индекс 0 соответствует всей совпавшей строке, индексы с 1 по 4 соответствуют соответствующим группам захвата в круглых скобках, и так далее.

  • Первое подвыражение в круглых скобках(\w+): захватывает часть веб-адреса, соответствующую протоколу, сопоставляя любое слово перед двоеточием и двумя прямыми косыми чертами. Результат:https
  • Второе подвыражение в скобках([^/:]+): захватывает часть адреса домена, соответствующую одному или нескольким символам, которые не являются : или /. Результат:www.example.com
  • Третье подвыражение в скобках(:\d*): захватывает номер порта (если есть), соответствующую нулю или более цифрам после двоеточия. Результат::80
  • Четвёртое подвыражение в скобках([^# ]*): захватывает информацию о пути и странице, соответствующую любой последовательности символов, которая не содержит # или пробелов. Результат:/html/html-tutorial.html
Другие расширения