Регулярные выражения в JavaScript
Для работы с языками, используемыми в Интернете, регулярные выражения играют огромную роль. Они представляют собой объекты (типа RegExp), описывающие текстовые шаблоны. За основу регулярных варажений в JavaScript взято их описание для серверного языка сценариев Perl.
Также, как строковые (символьные) данные задаются в кавычках, регулярные выражения заключаются в символы косой черты (/) (slash).
var regValue = /я$/;
var regValue = new RegExp("я$");
Оба приведенных варианта равноценны, но на практике чаще используют первый, как более краткий. Однако, при чтении данных из формы придется переводить символьный тип в регклярное выражение и потребуется конструктор RegExp().
Регулярное выражение может описывать как конкретный набор символов (/зуб/ означает строку "зуб", которая может содержаться в любом месте в словах межзубной, зубастый, острозуб и т.п.), так и менее конкретное сочетание, задаваемое спецсимволами, приведенными в табл.1.
Так выражение /зуб$/ означает, что шаблон соответствует расположению в конце строки (острозуб), а выражение /^зуб/ описывает размещение в начале строки (слово зубастый).
Помимо остального, следует учесть, что есть набор из 15 символов, играющих особую роль:
^ $ . * + ? ! : | \ / [ ] { }
Их нельзя использовать в явном виде. Чтобы включть обработку символа, его надо «заэкранировать», поставив перед ним символ \. То есть, символ | означает ИЛИ, а \| — наличие вертикальной черты в выражении. Отдельные аспекты этого разобраны в первой строке таблицы.
Таблица 1. Специальные символы в регулярных выражениях (источник, но содержание подвергнуто значительному техническому и смысловому редактированию)
Символ | Значение |
\ | Одно из следующих:
|
^ | Соответствует началу ввода. Если многострочный флаг установлен в true, совпадает также сразу после символа разрыва строки. Например, /^A/ не совпадает с 'A' в строке "an A", но совпадает с первым 'A' в строке "An A" |
$ | Совпадает с концом ввода. Если многострочный флаг установлен в true, совпадает также непосредственно перед символом разрыва строки. Например, /t$/ не совпадает с 't' в строке "eater", но совпадает с в строке "eat" |
* | Предшествующий символ совпадает 0 или более раз. Например, /bo*/ совпадает с 'boooo' в строке "A ghost booooed" и с 'b' в "A bird warbled", но не совпадает ни с чем в строке "A goat grunted" |
+ | Предшествующий символ совпадает 1 или более раз. Эквивалентно {1,}. Например, /a+/ совпадает с 'a' в "candy" и со всеми 'a' в "caaaaaaandy" |
? | Предшествующий символ совпадает 0 или 1 раз. Например, /e?le?/ совпадает с 'el' в "angel" и с 'le' в "angle." Если используется сразу после квантификаторов *, +, ? или {}, делает квантификатор нежадным (совпадает минимальное число раз), что противоположно действию по умолчанию, когда квантификатор — жадный (совпадает максимальное число раз). Используется также во вперёдсмотрящих/lookahead утверждениях, описанных в пунктах о x(?=y) и x(?!y) в этой таблице |
. | (Десятичная точка) совпадает с любым одиночным символом, исключая символ новой строки. Например, /.n/ совпадает с 'an' и с 'on' в "nay, an apple is on the tree", но не с 'nay' |
(x) | Совпадает с 'x' и запоминает совпадение. Это называется «захватывающие скобки». Например, /(foo)/ совпадает с 'foo', и запоминает её, в "foo bar." Совпадающая подстрока может быть вызвана из элементов результирующего массива [1], ..., [n] |
(?:x) | Совпадает с 'x', но не запоминает совпадение. Это называется «незахватывающие скобки». Совпадающая подстрока не может быть вызвана из элементов результирующего массива [1], ..., [n] |
x(?=y) | Совпадает с 'x' только в том случае, если после 'x' следует 'y'. Например, /Jack(?=Sprat)/ совпадает с 'Jack' только тогда, когда следом идёт 'Sprat'. /Jack(?=Sprat|Frost)/ совпадает с 'Jack' только тогда, когда следом идёт 'Sprat' или 'Frost'. Однако ни 'Sprat', ни 'Frost' не являются частью результата совпадения |
x(?!y) | Совпадает с 'x' только в том случае, если после 'x' не следует 'y'. Например, /\d+(?!\.)/ совпадает с числом только в том, случае, если после него нет десятичной точки. регулярное выражение /\d+(?!\.)/.exec(«3.141») совпадает с 141, но не совпадает с 3.141 |
x|y | Совпадает с 'x' или 'y'. Например, /green|red/ совпадает с 'green' в "green apple" и с 'red' в "red apple" |
{n} | Где n это положительное целое. Совпадает с точно n-количеством вхождений предшествующего символа. Например, /a{2}/ не совпадает с 'a' в "candy," но совпадает со всеми 'a' в "caandy" и с первыми двумя 'a's в "caaandy" |
{n,} | Где n это положительное целое. Совпадает с как минимум n вхождений предшествующего символа. Например, /a{2,} не совпадает с 'a' в "candy", но совпадает со всеми 'a' в "caandy" и в "caaaaaaandy" |
{n,m} | Где n и m это положительные целые. Совпадает с минимум n и с максимум m вхождений предшествующего символа. Например, /a{1,3}/ не совпадает ни с чем в "cndy", совпадает с 'a' в "candy", с первыми двумя 'a' в "caandy" и с первыми тремя 'a' в "caaaaaaandy" Заметьте, что при совпадении с "caaaaaaandy", совпадёт "aaa", хотя оригинальная строка содержит большее количество 'a' |
[xyz] | Один символ, совпадающий с любым из символов в скобках. Можно
задавать диапазон символов с помощью дефиса. Например, [abcd] это то же самое, что и [a-d]. Совпадает с 'b' в "brisket" и с 'c' в "ache". Выражение /[a-zAZ0-9]/ описывает все латинские буквы и цифры, /[\u0400-\u04FF]/ — любой кириллический символ, /[\u0021-\uffff]/ — любой символ, выводимый на экран |
[^xyz] | Один символ, НЕ совпадающий ни с одним из символов в скобках, кроме любого разделителя строки Unicode. Можно задавать диапазон символов с помощью дефиса. Например, [^abc] это то же самое, что [^a-c]. Они совпадают с 'r' в "brisket" и с 'h' в "chop" |
[\b] | Совпадает с backspace (особый случай, не путать с \b) |
\b | Совпадает на границе слова с таким символом, как space и символ новой строки (не путать с[\b]). Например, /\bn\w/ совпадает с 'no' в "noonday"; /\wy\b/ совпадает с 'ly' в "possibly yesterday" |
\B | Совпадает не на границе слова. Например, /\w\Bn/ совпадает с 'on' в "noonday", а /y\B\w/ совпадает с 'ye' в "possibly yesterday" |
\cX | Где X это управляющий символ. Совпадает с управляющим символом. Например, /\cM/ совпадает с control-M в строке, /\cJ/ — с переводом строки (\n) |
\d | Совпадает с цифровым символом (digit). Эквивалентно [0-9]. Например, /\d/ или /[0–9]/ совпадает с '2' в "B2 is the suite number" |
\D | Совпадает с любым нецифровым символом. Эквивалентно [^0-9]. Например, /\D/ или /[^0–9]/ совпадает с любой буквой в "B2 is the suite number", но не совпадает с '2' |
\f | Символ прогона страницы (form-feed) (\u000C) |
\n | Символ перевода строки (linefeed) (\u000A) |
\r | Символ возврата каретки (carriage return) (\u000D) |
\s | Любой разделительный символ Unicode, включая space, tab, form feed, line feed. Эквивалентно [\f\n\r\t\v\u00A0\u2028\u2029]. Например, /\s\w*/ совпадает с ' bar' в "foo bar" |
\S | Совпадает с одиночным символом, отличным от разделительного
символа Unicode. Эквивалентно [^\f\n\r\t\v\u00A0\u2028\u2029]. Например, /\S\w*/ совпадает с 'foo' в "foo bar" |
\t | Совпадает с табуляцией (tab) (\u0009) |
\v | Вертикальная табуляция (vertical tab) (\u0008) |
\w | Совпадает с любым текстовым символом ASCII, включая
символ подчёркивания (underscore). Эквивалентно [A-Za-z0–9_]. Например, /\w/ совпадает с 'a' в "apple," с '5', '2' и '8' в "$5.28", с '3' и 'D' в "3D&" |
\W | Совпадает с любым символом, не являющимся
текстовым символом ASCII. Эквивалентно [^A-Za-z0–9_]. Например, /\W/ или /[^$A-Za-z0–9_]/ совпадает с '%' в «50%» |
\n | Где n это положительное целое. Обратная ссылка на последнюю подстроку, совпавшую с n вхождений символа в скобках в регулярном выражении (включая левые скобки). (Здесь не совсем чётко... Прим. перев.) Например, /apple(,)\sorange\1/ совпадает с 'apple, orange,' в "apple, orange, cherry, peach." |
\0 | Символ NUL (\u0000). Не вводите после него других цифр |
\xhh | Символ с 16-ричным кодом hh (две 16-ричные цифры) |
\uhhhh | Символ с 16-ричным кодом hhhh (четыре 16-ричные цифры). |