Классы и спецсимволы регулярных выражений

Оцените материал
(0 голосов)

 

Здравствуйте! Продолжаем  рассматривать регулярные выражения.  Мы уже с вами разобрали паттерны регулярных выражений, а также методы регулярных выражений. И в этом уроке мы с вами познакомимся с  специсмволами и классами регулярных выражений.  Рассмотрим  такую вот  задачу –  допустим есть телефонный номер "+38(905)-123-45-67", и вам нужно найти в этой строке только цифры. А остальные символы вас вообще не интересуют.

Вот как раз для поиска символов определённого вида в регулярных выражениях предусмотрены «классы символов».

Класс символов – это  такое специальное обозначение, под которое подходит символ из определённого набора.

Вот например, есть класс «любая цифра». Он обозначается как  \d. Это обозначение добавляется в шаблон, и при поиске под него подходит уже  любая цифра.

Классы и спецсимволы регулярных выражений

 

 

Таким образом  регулярное выражение /\d/ ищет ровно 1 цифру:

var str1 = "+38(903)-123-45-67";
var reg1 = /\d/;

// не глобальный шаблон поэтому ищет только 1-ю цифру
alert( str.match(reg)); // 7

…Ну а для поиска всех цифр надо просто добавить  флаг g:

var reg1 = /\d/g;
alert( str1.match(reg1) ); // массив всех совпадений: 7,9,0,3,1,2,3,4,5,6,7

Важнейшие классы регулярных выражений: \d \s \w

Это был класс для цифр.

Но, есть и другие классы

Наиболее часто приходится сталкиваться с:

\d (от англ. «digit» – «цифра»)
Цифра, символ от 0 до 9.
\s (от англ. «space» – «пробел»)
Любой пробельный символ, включая табы, переводы строки и т.п.
\w (от английского «word» – «слово»)
Символ любого  «слова», а точнее – буква латинского алфавита или цифра или подчёркивание '_'. Не-английские буквы не являются \w, таким образом русская буква не подходит.

Вот пример, \d\s\w обозначает цифру, за которой  будет идти пробельный символ, а затем символ любого слова.

Регулярное выражение  также может содержать  обычные символы так и классы.

Вот пример, HTML\d найдёт строку HTML, с любой цифрой после неё:

var str1 = "Стандарт HTML5 - это просто здорово";
var reg1 = /HTML\d/
alert( str1.match(reg) ); // HTML5

Граница слова \b

Граница слова \b – это  очень особый класс.

Он может  интересен тем, что обозначает не сам символ, а границу между символами.

Например, \bJavaScript\b найдёт слово JavaScript в строке Hello, JavaScript!, но не в строке Hello, Java!.

alert( "Hello, JavaScript!".match(/\bJavaScript\b/) ); // JavaScript
alert( "Hello, Java!".match(/\bJava\b/) ); // null

Граница как правило  имеет «нулевую ширину» в том смысле, что обычно символам регулярного выражения  являются символы строки, но не в этом случае.

Граница – это  всегда проверка.

При поиске регулярное выражение  идёт по шаблону и одновременно по строке, пытаясь построить  так называемое соответствие. Когда он встречает  \b, то  осуществляет проверку, что позиция в строке подходит под одно из следующих условий:

  • Начало текста, в случае если  первый символ \w.
  • Конец текста,  в случае если последний символ \w.
  • Внутри текста,  в случае если с одной стороны \w, а с другой – не \w.

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

Для каждого класса есть  «обратный ему», представленный такой же, но заглавной буквой чтобы можно было их различать.

«Обратный» – означает, что ему доступны все остальные символы, например:

\D
Не-цифра, то есть любой символ кроме \d, например буква или пробел.
\S
Не-пробел, то есть любой символ кроме \s, например буква или цифра.
\W
Любой символ, кроме \w, то есть не латинница, не подчёркивание, не цифра. В частности, русские буквы принадлежат этому классу.
\B
Проверка, обратная \b то есть все кроме границы слова.

В начале этого урока мы с вами разбирали , как получить из телефона +38(903)-123-45-67 все цифры.

Первый способ – найти все цифры через match(/\d/g).

Обратные классы помогут реализовать обратный способ – найти все НЕцифры и удалить их из строки:

var str = "+38(903)-123-45-67";
alert( str1.replace(/\D/g, "") ); // 389031234567

Пробелы – обычные символы

Стоит отметить, что в регулярных выражениях пробел –  это такой же символ, как и  собственно другие.

Обычно  внимание на пробелы  мы не обращаем.  На наш взгляд строки 1-6 и 1 - 6 почти одинаковы.

Однако, если движок регулярных выражений  не  будет учитывает пробелов, то он  конечно не сработает.

Давайте найдем  цифры,  которые разделёны дефисом:

alert( "1 - 6".match(/\d-\d/) ); // null, нет совпадений!

Исправим это, добавив в шаблон пробелы:

alert( "1 - 6".match(/\d - \d/) ); // совпадения будут найдены

Следует отметить что, пробелы в шаблоне нужны лишь тогда, когда мы хотим их найти.

alert( "1-6".match(/\d - \d/) ); // null, поскольку в строке 1-6 нет пробелов

Другими словами в регулярном выражении все символы имеют определенное значение. И пробелы тому не исключение.

Точка –  это любой символ

Особняком стоит такой  класс символов как точка ".".

В  шаблоне регулярного  выражения, точка "."  обозначает  просто любой символ, кроме перевода строки:

alert( "X".match(/./) ); // найдено X

Посреди регулярного выражения:

var re = /CS.5/;
alert( "CSS5".match(re) ); // найдет "CSS5"
alert( "CS-5".match(re) ); // найдет "CS-5"
alert( "CS 5".match(re) ); // найдет "CS 5" (пробел это также символ)

Хочу обратить ваше внимание – что точка будет означать именно «произвольный символ».

Таким образом какой-то символ на этом месте в строке имеет место быть:

alert( "CS5".match(/CS.5/) ); // нет совпадений, поскольку для точки нет символа

Экранирование специальных символов

В регулярных выражениях есть также  и другие символы, имеющие  некий особый смысл.

Они  могут использоваться, чтобы расширить возможности поиска.

Вот  собственно их полный список: [ \ ^ $ . | ? * + ( ).

Не  надо пытаться  запомнить его – когда мы  с вами разберёмся с каждым из них по отдельности, он запомнится вам  сам собой.

Для того чтобы использовать специальный символ в качестве обычного, его следует экранировать.

Или, иначе говоря перед  этим символом надо поставить обратный слэш '\'.

Например, мы хотим найти точку '.'. В шаблоне регулярного выражения она обозначает «любой символ, кроме новой строки», поэтому для того чтобы найти именно сам символ «точка» – её следует экранировать: \..

alert( "Глава 5.2".match(/\d\.\d/) ); // 5.2

Круглые скобки также представляют из себя специальные символы, так что для поиска со скобками нужно использовать экран  \(. Пример ниже ищет строку "d()":

alert( "function d()".match(/d\(\)/) ); // "d()"

Ну и сам символ слэш '/', хотя и не будет специальными символом в регулярных выражениях, но  он открывает-закрывает шаблон в синтаксисе /...pattern.../, поэтому его следует экранировать.

Так  может выглядить поиск слэша '/':

alert( "/".match(/\//) ); // '/'

Ну и, конечно если нам нужно найти сам  собственно обратный слэш \, то его  просто нужно задублировать.

Так  может выглядит поиск обратного слэша "\":

alert( "3\2".match(/\\/) ); // '\'

Итого

Мы с вами разобрали  классы  регулярных выражений для поиска типов символов:

  • \d – цифры.
  • \D – не-цифры.
  • \s – пробелы, переводы строки.
  • \S – всё, кроме пробелов.
  • \w – латинница, цифры, подчёркивание '_'.
  • \W – всё, кроме букв.
  • '.' – точка обозначает  абсолютно любой символ, кроме перевода строки.

Если хочется поискать именно сочетание "\d" или символ «точка», то его следует  экранировать обратным слэшем, вот таким образом: \.

 

Задания

Найдите  электронное время

Время имеет формат часы:минуты. И часы и минуты могут  состоять  из 2 цифр, например: 09:00.

Напишите регулярное выражение для поиска времени в строке: Обед в 09:00.

Найдите номер кредитной карточки.

Номер кредитной карточки как правило состоит из 4 групп цифр по 4 в каждой. Вам надо  написать регулярное выражение для поиска  номера кредитной карточки в  строке.

"Иван вчера потерял свою кредитку, ее номер 1178-9087-2384-8787.  Поэтому он пошел в банк и описал ситуацию. Там пошли ему навстречу и выдали  новую кредитку под номером:  1103-8899-0811-1722."

 

 

 

Прочитано 199 раз Последнее изменение Суббота, 09 декабря 2017 14:51
Другие материалы в этой категории:
Понравилась запись? Подпишитесь на обновления по почте:

Нетология

TemplateMonster

geekbrains.ru/

Поиск по сайту

Google+