Регулярные выражения в JavaScript часть 3 (match, test, replace)

В предыдущей части статьи "Регулярные выражения в JavaScript часть 2 (replace)" мы говорили исключительно о методе replace, который заменяет часть строки. Есть ещё метод test, который выполняет поиск в строке по регулярному выражению.

Наличие подстроки в строке (метод test)

Этот метод возвращает true, если хотя бы одно совпадение найдено и false, если не было найдено ни одного совпадения. Но в отличии от методов, рассмотренных в предыдущих статьях, у test надо ставить регулярное выражение до названия метода через точку, а единственный параметр в скобках - это строка, в которой происходит поиск. Приведём пример использования:
var a = 'Тише, мыши, кот на крыше';
console.log( /ше/.test(a) );  // вернёт true
console.log( /сыр/.test(a) );  // вернёт false
Функция test применяется довольно часто для валидации значений полей в формах. К примеру, для проверки правильно ли введён мэйл адрес. Причём проверяется значение от начала до конца, поэтому ставятся знаки ^ и $:
var a = 'support@mousedc.ru';
console.log( /^[a-zA-Z-.]+@[a-z]+\.[a-z]{2,3}$/.test(a) ); // вернёт true

Получить часть подстроки (метод match)

Метод test всего лишь говорит есть или нет подстроки в строке. Но есть ещё метод match, который возвращает массив из подстрок, найденных по регулярному выражению. Посмотрим на практике, что это значит:
var a = 'Тише, мыши, кот на крыше';
console.log( a.match(/..ш./g) );
В результате выполнения такого кода в консоли будет распечатан массив, который содержит три найденных совпадения:
Array
(
   [0] => Тише
   [1] => мыши
   [2] => рыше
)

Замена в строке и карманы (метод replace)

Метод replace умеет использовать так называемые "карманы". То есть есть возможность обратиться к найденным вариациям внутри метода. Эти карманы появляются, если использовать скобки ( ). Их можно подставлять во второй параметр функции, используя порядковый номер и знак $. Таким образом можно заменять части строки так, что содержащиеся в кармане части будут подставляться на замену.
var a = 'Сыр, мышь, кот';
console.log( a.replace(/([а-я]+), ([а-я]+), ([а-я]+)/i, '$3, $1, $2') );
В первый карман попадёт слово "Сыр", во второй "мышь", а в третий "кот". По правилу '$3, $1, $2' результат будет иметь содержимое из 3 кармана, затем запятую и пробел, потом содержимое 1 кармана с запятой и пробелом, и в конце содержимое 2 кармана. Результат будет такой:
кот, Сыр, мышь
Напомним, что регулярными выражениями необходимо пользоваться только в том случае, если нет никакого другого способа решения.

Ошибки в регулярных выражениях - это очень частое явление. Поэтому прибегайте к этому инструменту только в самых-самых безвыходных ситуациях, когда всё остальное уже опробовано.
Можно обращаться к содержимому кармана непосредственно в регулярном выражении. То есть в карман заносятся данные и тут же достаются. Для этого необходимо поставить слеш \ и затем номер кармана непосредственно в регулярном выражении:
var a = 'Сыр, сыыр, сыыыр';
console.log( a.replace(/([а-я]+)\1/gi, '!') );
В приведённом примере выражение "/([а-я]+)\1/" сначала заносит в карман любую букву, а котом достаёт её же и ставит после найденной. Эффект получается такой, как будто мы находим повторяющуюся два раза букву и делаем её замену:
Сыр, с!р, с!ыр

Позитивный и негативный просмотр

Методом replace найденное выражение заменяется полностью на второй параметр. Но что делать, если нам не надо заменять всё найденное, а только часть? Для этого есть позитивный и негативный просмотр.

Представьте, что нужно заменить слово, не заменяя первую букву. Приведём пример реализации:
var a = 'Тише, мыши, кот на крыше';
console.log( a.replace(/(?!к)от/gi, 'отята') );
Результат будет такой:
Тише, мыши, котята на крыше
Хоть буква "к" и стоит в регулярном выражении, но она стоит в специальных скобках (?!к), которые проверяют наличие буквы, но не подставляют её на замену. Такие скобки называются негативным просмотром. Можно сделать позитивный просмотр и в конце строки:
var a = 'Тише, мыши, кот на крыше';
console.log( a.replace(/крыш(?=е)/gi, 'сыр') );
Позитивный просмотр (?=е) проверяет, есть ли в конце строки буква "е". Происходит замена и получается такая строка:
Тише, мыши, кот на сыре
Это конец темы регулярных выражений. Поэтому ещё раз напомним, что регулярными выражениями необходимо пользовать только в том случае, если нет никакого другого выхода.

Ошибки в регулярных выражениях - это очень частое явление. Поэтому прибегайте к этому инструменту только в самых-самых безвыходных случаях, когда не остаётся ничего другого.
MouseDC.ru - хостинг, виртуальный хостинг, покупка доменов, проверка доменов, WHOIS, покупка SSL сертификатов, доработка сайтов, сопровождение сайтов, разработка сайтов, техподдержка сайтов
Была ли эта статья полезна? Есть вопрос?
Cмотрите другие статьи: