Синтаксис регулярных выражений

Создание регулярных выражений в 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

Практика:

  1. Проверить есть ли в строке буква а
  2. Есть ли в строке две буквы а подряд
  3. Если в строке две буквы а
  4. Есть ли в строке ровно две буквы а
  5. Найти вхождение в строку упоминание времени, например 12:57 . Вывести на экран отдельно количество часов, отдельно количество минут
  6. Выбрать строки, которые не содержат три x подряд
  7. Проверить является ли строка номером телефона
  8. Проверить является ли строка емейлом
  9. Разбить предложение на слова
  10. Убрать лишние пробелы из строки
  11. Сделать транслитерацию
  12. Вывести все слова содержащие буквы k либо две буквы l
  13. Перевести все буквы к нижнему регистру
  14. Заменить в строке числа на квадраты чисел
  15. Узнать есть ли в строке повторяющееся слово

Дополнительные задачи http://habrahabr.ru/post/167015/

  1. Выделяем повторяющиеся последовательности тегом

results matching ""

    No results matching ""