Регулярные выражения в JavaScript
Автор: Выскорко М.С. (softtime.ru)
Введение
Регулярные выражения — это мощное средство для обработки
входящих данных. Задача, требующая замены или поиска текста, может быть
красиво решена с помощью этого "языка внутри языка". И хотя максимальный
эффект от регулярных выражений можно добиться при использования серверных
языков, всё же не стоит недооценивать возможности этого приложения и на
стороне клиента.
Примечание
Синтаксис регулярных выражений является достаточно
сложным и его изучение требует серьёзных усилий. Наилучшим руководством по
регулярным выражением на сегодняшний день является книга Дж. Фридла
"Регулярные выражения", позволяющая, по словам автора, "научиться мыслить
регулярными выражениями".
Основные понятия
Регулярное выражение (regular expression) —
средство для обработки строк или последовательность символов, определяющая
шаблон текста.
Модификатор — предназначен для "инструктирования"
регулярного выражения.
Метасимволы — специальные символы, которые служат
командами языка регулярных выражений.
Регулярное выражение задаётся как обычная переменная,
только вместо кавычек используется слэш, например: var
reg=/рег_выражение/
Под простейшими шаблонами будем понимать такие шаблоны,
которые не нуждаются в каких-либо специальных символах.
Допустим, нашей задачей является замена всех букв "р"
(малых и заглавных) на латинскую большую букву "R" в словосочетании Регулярные выражения.
Создаём шаблон var reg=/р/ и воспользуясь методом replace осуществляем задуманное
<script
language="JavaScript">
var str="Регулярные выражения"
var
reg=/р/
var result=str.replace(reg, "R")
document.write(result)
</script>
В результате получим строку — РегуляRные
выражения, замена произошла только на первом вхождении буквы "р" с
учётом регистра.
Но под условия нашей задачи этот результат не подходит...
Тут нам понадобятся модификаторы "g" и "i", которые могут
использоваться как отдельно, так и совместно. Эти модификаторы ставятся в
конце шаблона регулярного выражения, после слэша, и имеют следующие
значения:
модификатор "g" — задаёт поиск в строке как
"глобальный", т.е. в нашем случае замена произойдет для всех вхождений
буквы "р". Теперь шаблон выглядит так: var
reg=/р/g, подставив его в наш код
<script
language="JavaScript">
var str="Регулярные выражения"
var
reg=/р/g
var result=str.replace(reg, "R")
document.write(result)
</script>
получим строку — РегуляRные
выRажения.
модификатор "i" — задаёт поиск в строке без учёта
регистра, добавив этот модификатор в наш шаблон var
reg=/р/gi, после выполнения скрипта получим искомый результат
нашей задачи — RегуляRные выRажения.
Специальные символы (метасимволы)
Метасимволы задают тип символов искомой строки, способ
окружения искомой строки в тексте, а так же количество символов отдельного
типа в просматриваемом тексте. Поэтому метасимволы можно разделить на три
группы:
- Метасимволы поиска совпадений.
- Количественные метасимволы.
- Метасимволы позиционирования.
Метасимволы поиска совпадений
Символ |
Значение |
Описание |
Пример |
\b |
граница слова |
задаёт условие, при котором шаблон должен
выполняться в начале или конце слова |
/\ber/ совпадает с error, не
совпадает с hero или с player
/er/ совпдает
с player, не совпадает с hero или с error
/\ber\b/ не совпадает с hero или с player или с error, может совпасть только с er |
\B |
не граница слова |
задаёт условие, при котором шаблон не
выполняется в начале или конце слова |
/\Ber/ совпадает с hero или с player, не совпадает с error
/er\B/ совпадает с error или с player, не совпадает с hero
/\Ber\B/ совпадает с hero, не совпадает
с player или с error |
\d |
цифра от 0 до 9 |
- |
/\d\d\d\d/ совпадает с любым четырёх
значным числом |
\D |
не цифра |
- |
/\D\D\D\D/ не совпадёт с 2005 или 05.г или №126 и т.д. |
\s |
одиночный пустой символ |
соответствует символу пробела |
\over\sbyte\ совпадает только с over
byte |
\S |
одиночный непустой символ |
любой один символ за исключением
пробела |
\over\Sbyte\ совпадает с over-byte или с over_byte, не совпадает с over
byte или over--byte |
\w |
буква, цифра или символ подчёркивания |
- |
/A\w/ совпадает с A1 или с AB, не совпадает с A+ |
\W |
не буква, цифра или символ
подчёркивания |
- |
/A\W/ не совпадает с A1 или с AB, совпадает с A+ |
. |
любой символ |
любые знаки, буквы, цифры и т.д. |
/.../ совпадает с любыми тремя
символами ABC или !@4 или 1 q |
[ ] |
набор символов |
задаёт условие, при котором шаблон должен
выполняться при любом совпадении символов заключенных в квадратные
скобки |
/[QA]WERTY/ совпадает с QWERTY,
с AWERTY |
[^ ] |
набор не входящих символов |
задаёт условие, при котором шаблон не должен
выполняться при любом совпадении символов заключенных в квадратные
скобки |
/[^QA]WERTY/ не совпадает с QWERTY, с AWERTY |
Символы, приведенные в таблице "Метасимволы поиска
совпадений" не надо путать с последовательностью знаков перехода
используемых в строках, таких как \\t — табуляция, \\n - переход на новую
строку и т.д.
Количественные метасимволы
Символ |
Количество совпадений |
Пример |
* |
Ноль и большее количество раз |
/Ja*vaScript/ совпадает с JvaScript или с JaavaScript или с JaaavaScript,
не совпадает с JovaScript |
? |
Ноль или один раз |
/Ja?vaScript/ совпадает только с JvaScript или с JavaScript |
+ |
Один и большее количество раз |
/Ja+vaScript/ совпадает с JavaScript или с JaavaScript или с JaaavaScript, не совпадает с JvaScript |
{n} |
точно n раз |
/Ja{2}vaScript/ совпадает только с JaavaScript |
{n,} |
n или большее количество раз |
/Ja{2,}vaScript/ совпадает с JaavaScript или с JaaavaScript, не совпадает с JvaScript или с JavaScript |
{n,m} |
по крайней мере, n раз, но не более чем m
раз |
/Ja{2,3}vaScript/ совпадает только с JaavaScript или с JaaavaScript |
Каждый символ, приведенный в таблице "Количественные
метасимволы" применяется к одному предшествующему символу или метасимволу
в регулярном выражении.
Метасимволы позиционирования
Символ |
Совпадает с расположением |
Пример |
^ |
в начале строки |
/^Fred/ совпадает с Fred is OK,
не совпадает с I'm with Fred или с Is Fred here? |
$ |
в конце строки |
/Fred$/ совпадает с I'm with
Fred, не совпадает с Fred is OK или с Is Fred
here? |
Последний набор метасимволов предназначен для
обозначения, где искать (если это важно) подстроку в начале строки или в
конце.
Некоторые методы для работы с шаблонами
replace — данный метод мы уже использовали в самом
начале статьи, он предназначен для поиска образца и замены найденной
подстроки на новую подстроку.
test — данный метод проверяет, есть ли совпадения
в строке относительно шаблона и возвращает false, если
сопоставление с образцом закончилось неудачей, в противном случае true.
например:
<script
language="JavaScript">
var str="JavaScript"
var reg=/PHP/
var result=reg.test(str)
document.write(result)
</script>
выведет в качестве результата false, т.к. строка "JavaScript" не равна строке "PHP".
также метод test может возвращать вместо true или false
любую другую строку заданную программистом.
например:
<script
language="JavaScript">
var str="JavaScript"
var reg=/PHP/
var result=reg.test(str) ? "Строка совпала" : "Строка не совпала"
document.write(result)
</script>
в этом случае в качестве результата будет строка: Строка не совпала
exec — данный метод выполняет сопоставление строки
с образцом, заданным шаблоном. Если сопоставление с образцом закончилось
неудачей, то возвращается значение null. В
противном случае результатом является массив подстрок, соответствующих
заданному образцу. /*Первый элемент массива будет равен исходной строке
удовлетворяющее заданному шаблону*/
например:
<script
language="JavaScript">
var reg=/(\d+).(\d+).(\d+)/
var
arr=reg.exec("Я родился 15.09.1980")
document.write("Дата рождения: ",
arr[0], "< br>")
document.write("День рождения: ", arr[1], "<
br>")
document.write("Месяц рождения: ", arr[2], "< br>")
document.write("Год рождения: ", arr[3], "< br>")
</script>
в результате получим четыре строки:
Дата рождения: 15.09.1980
День рождения: 15
Месяц
рождения: 09
Год рождения: 1980
Заключение
В статье отображено далеко не все возможности и прелести
регулярных выражений, для более глубокого изучения этого вопроса посоветую
изучить объект RegExp. Так же хочу обратить внимание на то, что синтаксис
регулярных выражений не чем не отличается как в JavaScript, так и в PHP. К
примеру, для проверки правильности ввода e-mail, регулярное выражение, что
для JavaScript, что для PHP будет выглядеть одинаково /[0-9a-z_]+@[0-9a-z_^.]+.[a-z]{2,3}/i.