Оглавление

Метасимволы, используемые в регулярных выражениях.

Проверка правильности ввода дат и адресов электронной почты.

 

Как мы уже видели в приведенных ранее примерах, в регулярных выражениях присутствуют специальные символы, так называемые метасимволы. Они не всегда соответствуют отдельным символам строки, а управляют тем, как производится проверка строк. Два метасимвола позволяют осуществить привязку выражения к началу или концу строки:
□  ^ — привязка к началу строки. Если указан модификатор т, то соответствует началу каждой подстроки;
□  $ — привязка к концу строки. Если указан модификатор т, то соответствует концу каждой подстроки.

 

Рассмотрим на примере, как действует привязка:

var p = new RegExp("^[0-9]+$"); // Строка может содержать только числа
var Str = "2";
if (p.test(Str)) document.write("Число"); // Выведет "Число"
else document.write("Не число");
Str = "Строка2";
if (p.test(Str)) document.write("Число");
else document.write("Не число"); // Выведет "Не число"

 

Если убрать привязку к началу и концу строки, то любая строка, содержащая число, вернет "Число":

var p = new RegExp("[0-9]+");
var Str = "Строка2";
if (p.test(Str)) document.write("Есть число");
// Выведет "Есть число"
else document.write("Нет числа");


Можно указать привязку только к началу или только к концу строки:

var p = new RegExp("[0-9]+$");
var Str = "Строка2";
if (p.test(Str)) document.write("Есть число в конце строки");
else document.write("Нет числа в конце строки");
// Выведет "Есть число в конце строки"
p = new RegExp("^[0-9]+");
if (p.test(Str)) document.write("Есть число в начале строки");
else document.write("Нет числа в начале строки");
// Выведет "Нет числа в начале строки"


Квадратные скобки [] позволяют указать несколько символов, которые могут встречаться на этом месте в строке. Можно перечислять символы подряд или указать диапазон через тире:
□  [09] — соответствует числу 0 или 9;
□  [0-9] — соответствует любому числу от 0 до 9;
□  [абв] — соответствует буквам "а", "б" и "в";
□  [а-г] — соответствует буквам "а", "б", "в" и "г";

□  [а-яё] — соответствует любой букве от "а" до "я";
□  [АБС] — соответствует буквам "А", "Б" и "С". Обратите внимание, если не указан модификатор i, регистр будет иметь значение;
□  [А-ЯЁ] — соответствует любой букве от "А" до "Я";
□  [а-яёА-ЯЁ] — соответствует любой русской букве в любом регистре;
□  [0-9а-яёА-ЯЁа-zA-Z] — любая цифра и любая буква независимо от регистра и языка.

 

Значение можно инвертировать, если после первой скобки указать символ Л. Таким способом можно указать символы, которых не должно быть на этом месте в строке:
□  [^09] — не цифра 0 или 9;
□  [^0-9] — не цифра от 0 до 9;
□  [^a-яёA-ЯЁa-zA-Z] —не буква.


Вместо перечисления символов можно использовать стандартные метасимволы:
□  \d — соответствует любой цифре;
□  \w — соответствует любой латинской букве, цифре и знаку подчеркивания;
□  \s — любой пробельный символ (пробел, табуляция, перевод страницы, новая строка или перевод каретки);
□  . (точка) — любой символ, кроме символа перевода строки (\п);
□  \D — не цифра;
□  \W — не латинская буква, не цифра и не знак подчеркивания;(1)

□  \S — не пробельный символ.


Что же делать, если нужно найти точку, ведь символ "точка" соответствует любому символу, кроме символа перевода строки? Для этого перед специальным символом необходимо указать символ "" (листинг 30).

 

Листинг 30. Проверка правильности введенной даты

var Str = "29,04.2007";
// Неправильная дата (вместо точки указана запятая)
var p = /^[0-3]\d.[01]\d.[12][09]\d\d$/;
// Символ "" не указан перед точкой
if (p.test(Str)) document.write("Дата введена правильно");
else document.write("Дата введена неправильно");
// Выведет "Дата введена правильно", т. к. точка означает любой символ

p = /^[0-3]\d\.[01]\d\.[12][09]\d\d$/;
// Символ "" указан перед точкой
if (p.test(Str)) document.write("Дата введена правильно");
else document.write("Дата введена неправильно");
// Выведет "Дата введена неправильно", 
// т. к. перед точкой указан символ "", а в дате присутствует запятая

p = new RegExp("^[0-3]\\d\\.[01]\\d\\.[12][09]\\d\\d$");
// Символ "" указан перед точкой
if (p.test(Str)) document.write("Дата введена правильно");
else document.write("Дата введена неправильно");
// Выведет "Дата введена неправильно", 
// т. к. перед точкой указан символ ""

 

 

Обратите особое внимание на регулярное выражение в последнем примере:
^[0-3]\\d\\.[01]\\d\\.[12][09]\\d\\d$
В строке символ \ должен заменяться на \\. Поэтому вместо \d указано \\d, а вместо \. — \\.. Если этого не сделать, в первом случае Web-браузер сообщит об ошибке, а во втором случае — точка будет соответствовать любому символу, кроме символа перевода строки.


Напомним специальные символы, доступные в JavaScript, которые также доступны в регулярных выражениях:
□  \п — перевод строки;
□  \г — возврат каретки;
□  \f — перевод страницы;
□  \t — знак табуляции;
□  \v — знак вертикальной табуляции.


Количество вхождений символа в строку задается с помощью квантификаторов:

□  {n} — n вхождений предыдущего символа:

        \d{2} — последовательность из двух цифр;
□  {п,} — п или более вхождений предыдущего символа:

         \d{2,} — последовательность из двух или более цифр;

□  {n,m} — не менее п и не более m вхождений предшествующего символа.

                     Цифры указываются через запятую без пробела:
        \d{2, 5} — последовательность из двух, трех, четырех или пяти цифр;
□  * — произвольное число вхождений предыдущего символа, в том числе ни одного вхождения:
          \d* — пустая строка или строка из цифр;
□  +  — одно или большее число вхождений предшествующего символа в строку:
          \d+ — непустая строка, состоящая исключительно из цифр;
□  ? — ни одного или одно вхождение предыдущего символа в строку:
          \d? — цифра может встретиться один раз или не встретиться совсем.

 

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

\<Номер группы>
Нумерация групп символов осуществляется согласно их появлению в регулярном выражении. Рассмотрим пример:

var p = /<(.+)>(.*)<\/\1>/;
var Str = "<b><u>Подчеркнутый полужирный текст</u></b>";
var Mass = [];
Mass = p.exec(Str);
for (var i=0, c=Mass.length; i<c; i++)
   document.write(Mass[i] + "<br>");


Разберем регулярное выражение из этого примера:
□  <.+> — соответствует любому открывающему тегу без параметров;
□  <(.+)> — с помощью скобок запоминаем имя тега;
□  <\/\1> — ищем соответствующий закрывающий тег, который был найден в первых скобках;
□  (.*)   — сохраняем группу символов между открывающим и закрывающим тегами.

 

В окне Web-браузера отобразится:

Подчеркнутый полужирный текст
b
Подчеркнутый полужирный текст


Первая строка соответствует найденной строке <b><u>подчеркнутый полужирный текст</u></b>, вторая строка — символ в первых скобках, третья строка — группа символов во вторых скобках (<u>подчеркнутый полужирный
текст</u>).


С помощью круглых скобок можно объединять метасимволы в группы и применять квантификаторы ко всей группе. Рассмотрим это на примере (листинг 31) проверки правильности ввода E-mail- адреса.

 

Листинг 31. Проверка корректности адреса электронной почты

var p = /^[a-z0-9_\.\-]+@([a-z0-9\-]+\.)+[a-z]{2,6}$/i;
var Str = "unicross@mail.ru";
if (p.test(Str)) document.write("E-mail правильный");
else document.write("E-mail не правильный");

 

Итак, этому шаблону соответствует любой E-mail:

   /A[a-z0-9_\.\-]+@([a-z0-9\-]+\.) + [a-z] {2;6}$/i

 

Сравнение производится без учета регистра. Метасимвол ^ указывает привязку к началу строки, а $ — привязку к концу строки. E-mail разбивается на три части:
□  [a-z0-9_\.\-]+ — имя ящика, указанное до символа @;
□  ([a-z0-9\-]+\.)+ — имя поддомена, указанное после символа @, но до названия зоны. Так как поддоменов может быть много, подвыражение [a-z0-9\-]+\. заключается в круглые скобки, после которых ставится метасимвол +, указывающий, что подвыражение может встречаться один и более раз;
□   [a-z]{2,6} — название зоны может содержать только от 2-х до 6-ти букв (ru, com, info, travel).

Примечания:
  • Метасимвол \w работает только с буквами латинского алфавита. С буквами русского языка он не работает.
Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити