Лекция
Тема: «Работа с
регулярными выражениями»
План.
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. Методы, использующиеся регулярными выражениями |
|
|
Метод
RegExp, который выполняет поиск совпадения в строке. Он возвращает
массив данных. |
|
|
Метод
RegExp, который тестирует совпадение в строке. Возвращает либо истину, либо
ложь. |
|
|
Метод
String, который выполняет поиск совпадения в строке. Он возвращает массив
данных либо null если совпадения отсутствуют. |
|
|
Метод
String, который тестирует на совпадение в строке. Он возвращает индекс
совпадения, или -1, если совпадений не будет найдено. |
|
|
Метод
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. Какие методы используют регулярные выражение? Опишите их.