Регулярные выражения в JavaScript
Регулярные выражения — это мощное средство для обработки входящих данных. Задача, требующая замены или поиска текста, может быть красиво решена с помощью этого «языка внутри языка». И хотя максимальный эффект от регулярных выражений можно добиться при использования серверных языков, всё же не стоит недооценивать возможности этого приложения и на стороне клиента.
Основные понятия
Регулярное выражение (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 |
\B |
не граница слова |
задаёт условие, при котором шаблон не выполняется в начале или конце слова |
/\Ber/ совпадает с 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.