Синтаксис регулярных выражений
Создание регулярных выражений в JavaScript
var re1 = /ab+c/i;
var re2 = new RegExp('ab+c', 'i');
Общее описание регулярных выражений. Большая часть материала подходит и под JS http://www.php.su/lessons/?lesson_17
search
Изучим синтаксис регулярных выражений на примере функции search
search проверяет, есть ли в строке подстрока, соответствующая регулярному выражению. Если есть, то выводится позиция первой найденной подстроки в строке. Если подстрока, соответствующая регулярному выражению не была найдена, то search вернет -1. Например,
var str = "This is my test";
var res1 = str.search(/e/); //12
var res2 = str.search(/i/); //2, так как счет идет с нуля
var res3 = str.search(/a/); //-1
Попробуем написать регулярное выражение, которое находит слово внутри предложения
var str = "А пряников сладких и вкусных, всегда не хватает на всех!";
var res = str.search(/пряников/);
Допустим мы хотим проверить, что строка является нужным нам словом, тогда нам пригодятся символы начала и конца данных ^ и $ соответственно.
var password = 'swordfish';
var sentence = 'One of the words here is a swordfish';
password.search(/^swordfish$/);//0, пароль в точности соответствует слову swordfish
sentence.search(/^swordfish$/);//-1 . Да слово swordfish есть, но строка начинается не с него
Задавать регулярное выражение ввиде слова и искать это слово в предложении - слишком простая задача! Для этой цели мы могли бы использовать метод .substr. Регулярные выражения намного мощнее! Например мы хотим, чтобы наш шаблон находил как слово bingo, так и слово bongo. Для этих целей мы можем воспользоваться конструкцией символьный класс! Как видно, оба этих слова различаются одной буквой i и o - поместим их внутрь квадратных скобок [io] - такая конструкция означает, что вместо нее может быть либо i, либо o. Само регулярное выражение будет выглядеть вот так /b[io]ngo/
var str = "Какая девчонка! bingo-bongo! Ради такой я завалю даже Кинг-Конга!";
var res = str.search(/b[io]ngo/); // будет найдено слово bingo
Допустим мы хотим узнать, упоминаются ли в строке нужные нам слова king и queen. Нам будет достаточно только одного слова. В решении этой задачи нам помогут подмаска () и конструкция или |
var str = "We were the kings and queens of promise";
str.search(/(king|queen)/);//будет найден king в kings
Давайте теперь рассмотрим такую задачу. Представим, что мы ищем слово из пяти букв, которое заканчивается на 'ня'. Первые три буквы нам не важны, поэтому мы заменим их на символ . - то есть любой символ.
var re = /...ня/;
var str = 'Одесская кухня таит немало сюрпризов для непосвященных';
str.search(re);// будет найдено слово кухня
Повторения
Допустим мы хотим, чтобы строка начиналась с какой-то буквы, а дальнейшие символы могут быть любыми. Любой символ - это точка, но как задать их неопределенное количество? Для этого используется *
var re = /^a.*/i
var str1 = 'Афанасий';
var str2 = 'Василий';
str1.search(re);//0
str2.search(re);//-1
То есть .* - это любое количество любых символов. ^ - нам приходится использовать, потому что нам важно, чтобы строка начиналась с символа а. И важно добавить модификатор i, чтобы наш шаблон находил и большие буквы тоже.
Если нас интересуют строки, в которых должна быть одна и более буквы а, тогда нужно воспользоваться символом +
var start = 'Без паники!';
var stop = 'aaaaa';
var bad = 'bbbbb';
var re = /a+/;//одна и более буквы а
stop.search(re);//0
bad.search(re);//-1
var re2 = /a*/;
bad.search(re2);//0
Аналогично ? - это одно или ноль повторений.
var re = /(Great )?Odessa/;
{2,4} - задаст 2,3 или 4 повторения
{0,1} - тоже самое, что вопрос {0,} - тоже самое, что * {1,} - тоже самое, что +
Что характерно *, +, ? и даже {} можно применять как к отдельным символам так и к подмаскам.
var re = /(bla){3,3}/;//задаем три повторения
var important = 'blablabla';
important.search(re);//0
На самом деле мы могли бы упростить регулярное выражение до вида
var re = /(bla){3}/
Специальные символы в символьном классе
var re= /[^ab]*/
Любые символы, кроме символов a и b.
var re=/[a-d]{7}/
Слово из семи букв, каждая из которых может быть a,b,c,d
Если промежутков несколько, то всё-равно выбирается один символ
var re=/[0-9a-o]/
Дополнительные техники
Вернемся к нашему регулярному выражению /...ня/
Вообще-то точка подойдет вместо любого символа в том числе и пробела, поэтому в следущей строке тоже будет найдено совпадение.
var re = /...ня/;
var str = "Вася и Таня хорошо проводят время, изучая регулярные выражения".
str.search(re);// будет найдена ' Таня'
Примеры ниже не совсем корректны, потому что \w - не включает в себя символы кириллицы.
Чтобы избавиться от такой проблемы заменим . на \w - буква, цифра или нижнее подчеркивание.
var re = /\w\w\wня/;
var str = "Вася и Таня хорошо проводят время, изучая регулярные выражения".
str.search(re);// -1
var re = /\w\w\wня/;
var str = "Здесь будет найдена простыня, хотя это не слово из пяти букв".
str.search(re);// таки да найдена
Заменим на
var re = /\b\w\wня(\W|$)/;
Где \b - символ на границе слова, \W - всё что угодно, кроме цифры, буквы и нижнего подчеркивания, а $ - конец строки, то есть после 'ня' - либо какие-то символы, из которых слово не построишь, либо конец строки.
match
split
reg.exec
Практика:
- Проверить есть ли в строке буква а
- Есть ли в строке две буквы а подряд
- Если в строке две буквы а
- Есть ли в строке ровно две буквы а
- Найти вхождение в строку упоминание времени, например 12:57 . Вывести на экран отдельно количество часов, отдельно количество минут
- Выбрать строки, которые не содержат три x подряд
- Проверить является ли строка номером телефона
- Проверить является ли строка емейлом
- Разбить предложение на слова
- Убрать лишние пробелы из строки
- Сделать транслитерацию
- Вывести все слова содержащие буквы k либо две буквы l
- Перевести все буквы к нижнему регистру
- Заменить в строке числа на квадраты чисел
- Узнать есть ли в строке повторяющееся слово
Дополнительные задачи http://habrahabr.ru/post/167015/
- Выделяем повторяющиеся последовательности тегом