Оглавление

15.10. Класс RegExp. Проверка значений с помощью регулярных выражений

Класс RegExp позволяет осуществить поиск в строке с помощью регулярных выражений — шаблонов для поиска определенных комбинаций метасимволов. Регулярные выражения позволяют осуществлять очень сложный поиск. Создать экземпляр класса RegExp можно двумя способами:
<Экземпляр класса> = new RegExp(<Регулярное зыражение>[, <Модификатор>]); <Экземпляр класса> = /<Регуляркое Еыражение>/[<Модификатор>];
Необязательный параметр <модификатор> задает дополнительные параметры поиска. Он может содержать следующие символы:
□  i — поиск без учета регистра;
□  g — глобальный поиск (поиск всех вхождений регулярного выражения в строке);
□  m — многострочный режим. Символ ^ соответствует началу каждой подстроки, а $ — концу каждой подстроки:

var p = new RegExp("^[0-9]$", "mg");
var Str = "1\n2\n3\nстрока\n4";
Mass = Str.match(p);
document.write(Mass.join(", ")); // Выведет: 1, 2, 3, 4

□  gi — глобальный поиск без учета регистра символов.
При изучении класса String нами были оставлены без внимания три метода —
search(), match() И replace().

Рассмотрим способы их применения.
□  search(<Регулярное    выражение>)   возвращает  номер   позиции   первого вхождения подстроки, совпадающей с регулярным выражением:

var p = new RegExp("200[14]");
var Str = "2000, 2001, 2002, 2003, 2004";
document.write(Str.search(p)); // 6

Шаблону 200[14] соответствуют только два года: 2001 и 2004.
□  match(<Регулярное   выражение>)  возвращает массив с результатами поиска, совпадающими с регулярным выражением:

var p = new RegExp("200[14]");
var Str = "2000, 2001, 2002, 2003, 2004";
var Mass = [];
Mass = Str.match(p);
for (var i=0, c=Mass.length; i<c; i++)
   document.write(Mass[i] + "<br>");

Этот пример выведет только 2001, так как не указан модификатор глобального поиска g. Модифицируем его, чтобы получить все вхождения:

var p = new RegExp("200[14]", "g");
var Str = "2000, 2001, 2002, 2003, 2004";
var Mass = [];
Mass = Str.match(p);
for (var i=0, c=Mass.length; i<c; i++)
   document.write(Mass[i] + "<br>");

Теперь будут выведены все подстроки, совпадающие с регулярным выражением:

2001

2004

 


□  replace(<Регулярное выражение>,  <Текст для замены>) возвращает строку, которая является результатом поиска и замены в исходной строке с использованием регулярного выражения:

var p = new RegExp("200[14]", "g");
var Str = "2000, 2001, 2002, 2003, 2004";
Str = Str.replace(p, "2007");
document.write(Str); // "2000, 2007, 2002, 2003, 2007"

 

 

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

var p = new RegExp("[0-9]([0-9]+)", "g");
var Str = "2000, 2001, 2002, 2003, 2004";
Str = Str.replace(p, function(s, x) {
   document.write(x + ", ");
   var n = parseInt(s);
   n += 10;
   return n + "";
});
document.write("<br>" + Str);
// "000, 001, 002, 003, 004, "
// "2010, 2011, 2012, 2013, 2014"


В строке для замены можно использовать специальные переменные $1, ..., $n, через которые доступны фрагменты, заключенные в шаблоне в круглые скобки. В качестве примера поменяем два тега местами:

var p = new RegExp("<([a-z]+)><([a-z]+)>");
var Str = "<br><hr>";
Str = Str.replace(p, "&lt;$2&gt;&lt;$1&gt;");
document.write(Str);
// Выведет в окне Web-браузера: "<hr><br>"


Метод split (<Регулярное выражением [<Лимит>] ) также поддерживает регулярные выражения. Возвращает массив, полученный в результате разделения строки на подстроки по фрагменту, соответствующему регулярному выражению. Если второй параметр присутствует, то он задает максимальное количество элементов в результирующем массиве:

var Str = "1 2 3\n4\t5\r6";
var Mass = Str.split(/\s/);
document.write(Mass.join(", ")); // "1, 2, 3, 4, 5, 6"
var Mass2 = Str.split(/\s/, 3);
document.write(Mass2.join(", ")); // "1, 2, 3"

 

 

Вместо  методов  класса  string  можно  воспользоваться  методами  класса
RegExp:
□  test (<Строка>) возвращает true или false в зависимости от того, был поиск успешным или нет. В качестве примера произведем проверку правильности введенной даты (листинг 29).


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


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
         "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
 <title>Проверка вводимых данных</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
<script type="text/javascript">
<!--
var d = window.prompt("Введите дату в формате день.месяц.год", "");
if (d==null) {
   document.write("Вы нажали Отмена");
}
else {
   var p = /^[0-3]\d\.[01]\d\.\d{4}$/;
   if (p.test(d)) document.write("Дата введена правильно");
   else document.write("Вы неправильно ввели дату");
}
//-->
</script>
</body>
</html>

 

Введите дату

 

□  exec (<Строка>) позволяет получить массив с результатами поиска, совпадающими с регулярным выражением:


var p = new RegExp("(\\d{2}):(\\d{2}):(\\d{2})");
var Str = "Sun Apr 29 18:47:27 UTC+0400 2007";
var Mass = [];
Mass = p.exec(Str);
document.write(Mass.join("<br>"));

Эта программа выведет

18 :47:27
18
47
27

 

Первая строка соответствует найденному фрагменту (элемент массива с индексом 0). Вторая, третья и четвертая строки содержат фрагменты, соответствующие группам метасимволов (\\d{2}), заключенных в круглые скобки. Номер скобок по порядку следования в регулярном выражении соответствует индексу фрагмента в массиве.

Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити