Лекция

Тема: «Работа с регулярными выражениями»

 

План.

1.    Использование регулярных выражений, шаблонов, специальных символов.

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

3.    Использование круглых скобок в регулярных выражениях.

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

 

 

1. Использование регулярных выражений, шаблонов, специальных символов

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

 

Инициализация регулярного выражения:

var re = /шаблон/ модификаторы;

шаблон позволяет задать шаблон символов для поиска.

модификаторы позволяют настроить поведение поиска:

 

Использование простых шаблонов

Самым простым применением регулярных выражений является поиск слов и выражений в различных текстах.

Шаблон регулярного выражения состоит из обычных символов, например /abc/, или комбинаций обычных и специальных символов, например /ab*c/.

 

Пример.  Использование поиска с применением модификаторов:

//Зададим регулярное выражение rv1

rv1=/Россия/;

//Зададим регулярное выражение rv2

rv2=/Россия/g;

//Зададим регулярное выражение rv3

rv3=/Россия/ig;

 

//Жирным шрифтом выделено, где в тексте будут найдены совпадения при использовании

//выражения rv1:

 

Россия является крупнейшим государством мира. Россия граничит с 18 странами.

РОССИЯ является государством-продолжателем СССР.

 

//Жирным шрифтом выделено, где в тексте будут найдены совпадения при использовании

//выражения rv2:

 

Россия является крупнейшим государством мира. Россия граничит с 18 странами.

РОССИЯ является государством-продолжателем СССР.";

 

//Жирным шрифтом выделено, где в тексте будут найдены совпадения при использовании

//выражения rv3:

 

Россия является крупнейшим государством мира. Россия граничит с 18 странами.

РОССИЯ является государством - продолжателем СССР.";

 

Использование специальных символов

В случае, когда поиск соответствия требует чего-то большего, чем прямое сопоставление, например нахождение последовательности символов 'b' или нахождение пробела, шаблон включает в себя специальные символы. Например, шаблон /ab*c/ соответствует любой комбинации символов, в которой за 'a' следует ноль или более символов 'b' (* означает ноль или более вхождений предыдущего символа), за которыми сразу же следует символ 'c'. В строке "cbbabbbbcdebc," этому шаблону сопоставляется подстрока 'abbbbc'.

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

Описание

.

Совпадает с любым символом, кроме символа конца строки.

\W

Совпадает с любым буквенным символом.

\w

Совпадает с любым не буквенным символом.

\d

Совпадает с символами, которые являются цифрами.

\D

Совпадает с символами, которые не являются цифрами.

\s

Совпадает с пробельными символами.

\S

Совпадает с не пробельными символами.

\b

Совпадения будут искаться только на границах слов (в начале или конце).

\B

Совпадения будут искаться только не на границах слов.

\n

Совпадает с символом перевода строки.

 

Пример:

/* Выражение reg1 найдет все слова начинающиеся на две произвольные буквы и заканчивающиеся на 'вет'. Так как слова в предложении разделяются пробелом, то в начале и в конце добавим спецсимвол \s) */

reg1=/\s..вет\s/g;

txt=' привет завет вельвет клозет ';

document.write(txt.match(reg1) + '<br />');

 

/* Выражение reg2 найдет все слова начинающиеся на три произвольные буквы и заканчивающиеся на 'вет' */

reg2=/\s...вет\s/g;

document.write(txt.match(reg2) + '<br />');

txt1=' при2вет привет при1вет ';

 

/* Выражение reg3 найдет все слова, которые начинаются на 'при' в которых потом следует 1 цифра и заканчиваются на 'вет' */

var reg3=/при\dвет/g;

document.write(txt1.match(reg3) + '<br />');

 

// Выражение reg4 найдет все цифры в тексте

var reg4=/\d/g;

txt2='5 лет учебы, 3 года плавания, 9 лет стрельбы.'

document.write(txt2.match(reg4) + '<br />');

 

Символы в квадратных скобках

Используя квадратные скобки [кейу] Вы можете указать группу символов, поиск которых нужно произвести.

Символ ^ перед группой символов в квадратных скобках [^квг] говорит о том, что нужно произвести поиск всех символов алфавита, кроме заданных.

Используя тире (-) между символами в квадратных скобках [а-z] Вы можете задать диапазон символов, поиск которых нужно произвести.

С помощью квадратных скобок [012] Вы можете также искать числа.

 

Пример:

//Зададим регулярное выражение reg1

reg1=/\sко[тдм]\s/g;

 

//Зададим строку текста txt1

txt1=' кот коса код комод ком ковер ';

 

//Произведем с помощью регулярного выражения reg1 поиск по строке txt1

document.write(txt1.match(reg1) + '<br />');

 

reg2=/\sсло[^тг]/g;

txt2=" слот слон слог ";

document.write(txt2.match(reg2) + '<br />');

 

reg3=/[0-9]/g;

txt3="5 лет учебы, 3 года плавания, 9 лет стрельбы";

document.write(txt3.match(reg3));

 

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

Квантификатор - это конструкция, позволяющая задать, сколько раз предшествующий ей символ или группа символов, должна встречаться в совпадение.

 

Синтаксис:

//Предшествующий символ должен встречаться x - раз

{x}

//Предшествующий символ должен встречаться от x до у раз включительно

{x,y}

//Предшествующий символ должен встречаться не менее x раз

{x,}

//Указывает, что предшествующий символ должен встречаться 0 или более раз

*

//Указывает что предшествующий символ должен встречаться 1 или более раз

+

//Указывает что предшествующий символ должен встречаться 0 или 1 раз

?

 

//Зададим регулярное выражение rv1

rv1=/ко{5}шка/g

//Зададим регулярное выражение rv2

rv2=/ко{3,}шка/g

//Зададим регулярное выражение rv3

rv3=/ко+шка/g

//Зададим регулярное выражение rv4

rv4=/ко?шка/g

//Зададим регулярное выражение rv5

rv5=/ко*шка/g

 

//Жирным шрифтом показано, где в тексте будут найдены совпадения при использовании

//выражения rv1:

 

кшка кошка коошка кооошка коооошка кооооошка коооооошка кооооооошка

 

//Жирным шрифтом показано, где в тексте будут найдены совпадения при использовании

//выражения rv2:

 

кшка кошка коошка кооошка коооошка кооооошка коооооошка кооооооошка

 

//Жирным шрифтом показано, где в тексте будут найдены совпадения при использовании

//выражения rv3:

 

кшка кошка коошка кооошка коооошка кооооошка коооооошка кооооооошка

 

//Жирным шрифтом показано, где в тексте будут найдены совпадения при использовании

//выражения rv4:

 

кшка кошка коошка кооошка коооошка кооооошка коооооошка кооооооошка

 

//Жирным шрифтом показано, где в тексте будут найдены совпадения при использовании

//выражения rv5:

 

кшка кошка коошка кооошка коооошка кооооошка коооооошка кооооооошка

 

//создаем массив найденных совпадений и печатаем их в документ

var text=t.match(rv2);

for (i=0; i<text.length; i++)

document.write(text[i]+'<br>');

// будет напечатано:

кооошка //соответствует text[0]
коооошка //соответствует text[1]
кооооошка
коооооошка
кооооооошка

 

Обратите внимание: если Вы хотите использовать какой-либо специальный символ (такой как . [] * + ? или {}) как обычный Вы должны поставить перед ним \.

 

3. Использование круглых скобок в регулярных выражениях

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

К примеру, регулярное выражение /(Дмитрий)\sВасильев/ найдет строку 'Дмитрий Васильев' и запомнит подстроку 'Дмитрий'.

В примере ниже мы используем метод replace(), чтобы изменить порядок слов в тексте. Для обращения к сохраненным совпадениям мы используем $1 и $2.

 

var regexp = /(Дмитрий)\s(Васильев)/;

var text = 'Дмитрий Васильев';

var newtext = text.replace(regexp, '$2 $1');

document.write(newtext);

 

Круглые скобки могут использоваться для группировки символов перед квантификаторами.

 

txt='хохохо хахаха хихихи';

regex1=/(ха){3}/g;

document.write(txt.match(regex1));

 

Круглые скобки также используются для поиска альтернатив.

txt=" яблоко, банан, картошка, груша, перец ";

regex1=/(яблоко|банан|груша)/ig;

document.write(txt.match(regex1));

 

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

exec

Метод RegExp, который выполняет поиск совпадения в  строке. Он возвращает массив данных.

test

Метод RegExp, который тестирует совпадение в строке. Возвращает либо истину, либо ложь.

match

Метод String, который выполняет поиск совпадения в строке. Он возвращает массив данных либо null если совпадения отсутствуют.

search

Метод String, который тестирует на совпадение в строке. Он возвращает индекс совпадения, или -1, если совпадений не будет найдено.

replace

Метод String, который выполняет поиск совпадения в строке, и заменяет совпавшую подстроку другой подстрокой переданной как аргумент в этот метод.

 

Простейший из методов - метод  search(). Он принимает в качестве аргумента регулярное выражение и возвращает либо позицию первого символа найденной подстроки, либо -1, если соответствие не найдено. Например, следующий вызов вернет 4:

 

var result = "JavaScript".search(/script/i);    // 4

 

Если аргумент метода search() не является регулярным выражением, он сначала преобразуется путем передачи конструктору RegExp. Метод search() не поддерживает глобальный поиск и игнорирует флаг g в своем аргументе.

Метод replace() выполняет операцию поиска с заменой. Он принимает в качестве первого аргумента регулярное выражение, а в качестве второго - строку замены. Метод отыскивает в строке, для которой он вызван, соответствие указанному шаблону.

Если регулярное выражение содержит флаг g, метод replace() заменяет все найденные совпадения строкой замены. В противном случае он заменяет только первое найденное совпадение. Если первый аргумент метода replace() является строкой, а не регулярным выражением, то метод выполняет буквальный поиск строки, а не преобразует его в регулярное выражение с помощью конструктора RegExp(), как это делает метод search().

В качестве примера мы можем воспользоваться методом replace() для единообразной расстановки прописных букв в слове «JavaScript» для всей строки текста:

 

// Цитата - это кавычка, за которой следует любое число символов,

// отличных от кавычек (их мы запоминаем), за этими символами

// следует еще одна кавычка

var quote = /"([^"]*)"/g;

 

// Заменяем прямые кавычки типографскими и оставляем без изменений  «$1»

// содержимое цитаты, хранящееся в $1

var text = '"JavaScript" - интерпретируемый язык программирования.';

var result = text.replace(quote, "«$1»");            

// «JavaScript» - интерпретируемый язык программирования.

 

Метод match() - это наиболее общий из методов класса String, использующих регулярные выражения. Он принимает в качестве единственного аргумента регулярное выражение (или преобразует свой аргумент в регулярное выражение, передав его конструктору RegExp()) и возвращает массив, содержащий результаты поиска. Если в регулярном выражении установлен флаг g, метод возвращает массив всех соответствий, присутствующих в строке. Например:

 

// вернет ["1", "2", "3"]

var result = "1 плюс 2 равно 3".match(/\d+/g);

 

Если регулярное выражение не содержит флаг g, метод match() не выполняет глобальный поиск; он просто ищет первое совпадение. Однако match() возвращает массив, даже когда метод не выполняет глобальный поиск. В этом случае первый элемент массива - это найденная подстрока, а все оставшиеся элементы представляют собой подвыражения регулярного выражения. Поэтому если match() возвращает массив arr, то arr[0] будет содержать найденную строку целиком, arr[1] -подстроку, соответствующую первому подвыражению, и т.д. Проводя параллель с методом replace(), можно сказать, что в arr[n] заносится содержимое $n.

 

var url = /(\w+):\/\/([\w.]+)\/(\S*)/;

var text = "Посетите наш сайт http://www.professorweb.ru/index.php";

 

var result = text.match(url);

if (result != null) {

     var fullurl = result[0];     // Содержит "http://www.professorweb.ru/index.php"

     var protocol = result[1];         // Содержит "http"

     var host = result[2];             // Содержит "www.professorweb.ru"

     var path = result[3];             // Содержит "index.php"

}

Последний из методов объекта String, в котором используются регулярные выражения - split(). Этот метод разбивает строку, для которой он вызван, на массив подстрок, используя аргумент в качестве разделителя. Например:

 

"123,456,789".split(",");         // Вернет ["123","456","789"]

Метод split() может также принимать в качестве аргумента регулярное выражение. Это делает метод более мощным. Например, можно указать разделитель, допускающий произвольное число пробельных символов с обеих сторон:

 

"1, 2, 3 , 4 , 5".split(/\s*,\s*/);        

// Вернет ["1","2","3","4","5"]

 

Чтобы просто узнать есть ли в строке что-либо соответствующее шаблону, воспользуйтесь методами test или search; а чтобы получить больше информации пользуйтесь методами exec или match (хотя эти методы работают медленнее). Если вы пользуетесь exec или match и если совпадения есть, эти методы вернут массив и обновленные свойства объекта ассоцированного регулярного выражения, а также предопределенного объекта RegExp регулярного выражения. Если совпадений нет, метод exec вернет null (который сконвертируется в  false).

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

 

Пример

 

//Зададим регулярное выражение rv1

rv1=/ко{5}шка/g

//Зададим строку текста, в котором будем искать совпадения

txt='кшка кошка коошка кооошка коооошка кооооошка коооооошка кооооооошка';

document.write(rv1.exec(txt));

 

С помощью метода test() Вы можете проверить, содержится ли в тексте выражение, заданное в регулярном выражении. Если выражение содержится в тексте, метод возвращает true, а если нет false.

 

Пример

 

//Зададим регулярное выражение rv1

rv1=/ко{5}шка/g

//Зададим строку текста, в котором будем искать совпадения

txt='кшка кошка коошка кооошка коооошка кооооошка коооооошка кооооооошка';

//Произведем поиск по шаблону rv1 в строке текста txt

document.write(rv1.test(txt) + '<br />');

//Зададим регулярное выражение rv2

rv2=/тигр/g;

//Произведем поиск по шаблону rv2 в строке текста txt

document.write(rv2.test(txt));

 

КОНТРОЛЬНЫЕ ВОПРОСЫ

1.      Что такое регулярное выражение?

2.      Как задать регулярное выражение?

3.      Что такое модификаторы в регулярном выражении?

4.      Опишите использование простых шаблонов.

5.      Какие символы используют в регулярных выражениях? Назовите их назначение.

6.      Что задают символы в квадратных скобках?

7.      Что такое квантификаторы и как их использовать?

8.      Как сохранять найденные совпадения?

9.      Какие методы используют регулярные выражение? Опишите их.