базовый курс

ГРУППА КУРСА

Методы для работы с регулярными выражениями

Для работы с регулярными выражениями существует встроенный класс объектов RegExp. Когда мы пишем регулярное выражение, мы создаём объект этого класса и можем использовать его методы. Некоторые методы объектов String также работают с регулярками.

Поиск подстроки

Метод match() возвращает массив, каждый элемент которого содержит подстроку, найденную регулярным выражением. Он использовался в прошлых темах, поэтому подробно описывать его я не буду. При отсутствии флага g всё равно возвращается массив, содержащий первое совпадение. Массив также имеет два свойства. Свойство index, указывающее позицию первого символа найденной подстроки. Свойство input содержит всю строку, в которой найдено совпадение. При наличии флага g этих свойств нет.

Для поиска позиции подстроки используется метод exec объекта RegExp.

regexp.exec (строка)

Без флага g метод работает также как match. С флагом g он при первом вызове находит первое совпадение, на втором вызове - второе совпадение и так далее. Каждый раз он возращает массив с найденной подстрокой. Массив имеет свойство ingex c номером первого символа найденного совпадения. Когда совпадения закончились, метод возвращает NULL.

Создадим скрипт, который находит в тексте все англайские слова и выводит на экран позиции первых символов этих слов:

+
1
2
3
4
5
6
7
8
<!DOCTYPE html>
<html>
<head>
<title>Страница</title>
<meta charset="utf-8">
</head>
<body>
<script>
9
10
11
12
13
14
15
16
17
var str = 'Сайты создаются на HTML. Ещё применяют JavaScript и PHP';
var reg = /[a-z]+/gi;
var mas; //массив, возвращаемый методом
var numbers = new Array(); //массив для позиций найденных слов
while (mas = reg.exec(str))
  {
  numbers.push(mas.index);
  }
document.write(numbers);

Чтобы метод exec() нашёл очередную подстроку, он должен начинать поиск с символа, следующего за предыдущей подстрокой. Для этого объект RegExp имеет свойство lastIndex. Оно указывает позицию, с которой нужно начинать поиск. Сначала оно равно нулю. Когда найдена подстрока, в свойство записывается номер символа, следующего за подстрокой. Если совпадение не найдено, то оно снова приравнивается к нулю. lastIndex можно самостоятельно указать в скрипте. Если добавить в наш пример такую строку, то первое слово не будет найдено:

11
reg.lastIndex = 28;

Метод test() используют когда нужно узнать, есть ли подстрока в тексте.

regexp.test (строка)

Он возвращает true при наличии хотя бы одного совпадения.

Замена подстроки

Метод строки replace() заменяет подстроку на новую. Вместо заменяемой подстроки можно написать регулярное выражение.

Удалим текст, написанный в скобках:

18
19
20
21
str='Иван зинмается летними (бег) и зимними (лыжи) видами спорта';
reg = /\([ёа-я]+\)/g;
var newstr = str.replace(reg, '');
document.write('<br>'+newstr);

Заменяемую подстроку можно вставить в новую подстроку. Подробно об этом говорилось при рассмотрении метода replace(). Скобки в регулярном выражении делят найденную подстроку на части и позволяют вставлять эти части по отдельности. Первые скобки вставляет код $1. Если есть вторые, то их вставляет код $2. Так можно разделить паттерн на любое количество частей. Поменяем местами названия стран и их столицы:

22
23
24
str= 'Париж - Франция, Мадрид - Испания, Рим - Италия, Лиссабон - Португалия';
reg = /([ёа-я]+) - ([ёа-я]+)/gi;
document.write('<br>'+str.replace(reg, '$2 - $1'));