Изучаем регулярные выражения самостоятельно – символьные классы ( часть 2 )

регулярные выражения - символьные классы

В предыдущей статье мы узнали, что такое регулярные выражения и как их использовать. Также, ещё мы познакомились с основными якорями, которые указывают на начало (^) и конец ($) строки.

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

Символьные классы

Если откроем справочник регулярных выражений, то увидим, что символьные классы это некие специальные буквы, перед которыми стоит обратный слэш (\). И каждая буква, в зависимости от регистра, представляет какую-то определённую область(классу) символов.

Рассмотрим каждого символа подробнее.

Пробел

\s — Представляет любой пробельный символ. Это может быть обычный пробел, переход на новую строку или табуляция.

Представлю пару примеров использования данного символьного класса, на языке JavaScript.

Пробел между словами. Здесь мы указываем что между словами ' Hi ' и 'people' должен быть один пробел.

var str = 'Hi people';
var reg = /Hi\speople/;

alert(reg.test(str));// true

Если между этими словами добавим больше одного пробела, то результатом проверки будет уже false.

var str = 'Hi   people';
var reg = /Hi\speople/;

alert(reg.test(str));// false

Чтобы результат проверки был true, нужно чтобы количество добавленных пробелов в строке, соответствовало количеству символов \s из регулярного выражения.

var str = 'Hi   people';
var reg = /Hi\s\s\speople/;

alert(reg.test(str));// true

Теперь добавим пару пробелов в начале строки, а в регулярном выражении оставим только символ \s. Как думайте, строка будет соответствовать такому регулярному выражению?

var str = '    Hi people';
var reg = /\s/;

alert(reg.test(str));// true

Правильно, оно будет соответствовать так как достаточно чтобы часть строки соответствовала, и вся строка считается соответственной.

Тоже самое будет если добавим пробельный символ в конце строки.

var str = 'Hipeople ';
var reg = /\s/;

alert(reg.test(str));// true

А если в начале регулярного выражения добавим якорь ^, какой результат будет?

var str = 'Hipeople ';
var reg = /^\s/;

alert(reg.test(str));// false

А результат у нас будет false. Потому что в начале строки нет пробельного символа.

Как я сказал выше, символ \s представляет любой пробельный символ. Давайте в конце строки добавим символ перехода на новую строку(\n) и посмотрим, что за результат будет в таком случае.

var str = 'Hipeople\n';
var reg = /\s/;

alert(reg.test(str));// true

И видим, что результат у нас получился true.

И последний такой лёгкий эксперимент, какой результат будет если мы уберём все пробелы из строки?

var str = 'Hipeople';
var reg = /\s/;

alert(reg.test(str));// false

Разумеется, результат будет false

Не пробел

\S — Представляет любой символ, кроме пробела. То есть это могут быть абсолютно любые символы, буквы, цифры, спец знаки, но, кроме пробельных символов.

Например, если в строке будут только пробелы то результат будет false.

var str = '      ';
var reg = /\S/;

alert(reg.test(str));// false

Такой же результат будет если строка содержит символ перехода на новую строку (\n) и ещё пару пробелов.

var str = '\n     ';
var reg = /\S/;

alert(reg.test(str));// false

А если в строке мы добавим какой-то символ, например, символ доллара, то результат будет true.

var str = '\n   $  ';
var reg = /\S/;

alert(reg.test(str));// true

Слово

\w — означает любые буквы или цифры. Пробелы и разные спец символы в представление этого символьного класса не входят.

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

var str = '----c-==';
var reg = /\w/;

alert(reg.test(str));// true
var str = '----0-==';
var reg = /\w/;

alert(reg.test(str));// true

Не слово

\W — В этот символьный класс входить любой символ, кроме буквы и цифры.

Если строка состоит только из букв и цифр, то она не соответствует этому символьному классу.

var str = 'cock2017';
var reg = /\W/;

alert(reg.test(str));// false

Цифра

\d — это символ любой цифры, от 0 до 9.

var str = '5++++';
var reg = /\d/;

alert(reg.test(str));// true

Если в строке находится число больше 9, то только часть строки будет соответствовать регулярному выражению, благодаря первой цифры из этого числа.

var str = 'Year 2017';
var reg = /\d/;

alert(reg.test(str));// true

Не цифра

\D — представляет любой символ кроме цифры.

Если строка состоит только из цифр, то результатом проверки будет false.

var str = '2017';
var reg = /\D/;

alert(reg.test(str)); // false

Достаточно добавить любой символ, кроме цифры и результат станет true.

var str = '20k17';
var reg = /\D/;

alert(reg.test(str)); // true

Закрепляем материал

Для закрепления материала поэкспериментируем со строкой и регулярным выражении.

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

var str = 'year2017 ';
var reg = /year\d\d\d\d\s\s/;

alert(reg.test(str)); // false

Здесь у нас false потому что не хватает одного пробельного символа в конце строки. В регулярном выражении сказано, что формат строки должен быть такой: слово 'year' потом, любые 4 цифры и в конце 2 пробельных символов. А у нас в конце только один пробельный символ.

Дальше, добавим в регулярном выражении ещё пару символьных классов. А в строке добавим соответствующие символы, чтобы она соответствовала указанному регулярному выражению.

var str = 'year2017  m&m 5 number8 %';
var reg = /year\d\d\d\d\s\sm\Sm\W\w\Wnumber\d\s\D/;

alert(reg.test(str)); // true

Результатом проверки будет true. Теперь попробуем прочитать регулярное выражение чтобы узнать почему результат true а не false.

Видим, что после year\d\d\d\d\s\s указана маленькая буква m, значит в строке после year2017 и два пробельных символов тоже должна быть маленькая буква m. Если в строке напишем большую букву 'M' то результат сразу же станет false.

Дальше, после маленькой m, мы указали что может быть любой символ кроме пробела (\S). Ну и мы поставили символ амперсанда, он ведь не является пробелом. Попробуем поставить любой другой символ, например, звёздочку:

var str = 'year2017  m*';
var reg = /year\d\d\d\d\s\sm\S/;

alert(reg.test(str)); // true

Результат также будет true.

Возвращаемся к разборке нашего большого примера.

В регулярном выражении указано что после символа, который не является пробелом(\S), должна быть ещё одна маленькая буква 'm'. Если мы в строке, вместо этой буквы напишем любой другой символ, то, результат сразу же станет false.

var str = 'year2017  m&X';
var reg = /year\d\d\d\d\s\sm\Sm/;

alert(reg.test(str)); // false

Дальше, указан символ класса \W, значит, в строке, после маленькой буквы 'm', должен быть один символ, который не является буквой или цифрой. Мы к примеру, написали простой пробел. Если этот пробел убрать, то строка не будет соответствовать регулярному выражению.

Вы можете написать любой другой символ вместо пробела и посмотреть какой будет результат.

var str = 'year2017  m&m-';
var reg = /year\d\d\d\d\s\sm\Sm\W/;

alert(reg.test(str)); // true

Переходим к следующему символьному классу из выражения (\w). Этот символ класса указывает, что следующем символом в строке должно быть буква или цифра, ну мы и поставили цифру 5.

Регистр буквы у этого символьного класса (\w) не имеет значение. То есть буква может быть, как в нижнем регистре (маленькая), так и в верхнем (большая). Если укажем любой другой символ кроме буквы или цифры, то результатом проверки будет 'false'.

var str = 'year2017  m&m +';
var reg = /year\d\d\d\d\s\sm\Sm\W\w/;

alert(reg.test(str)); // false

Дальше, нужно чтобы в строке было любой символ кроме буквы и цифры (\W). Мы для наглядности написали пробел. Сразу после пробела должно быть слово 'number'.

Если мы каким-то образом поменяем это слово (изменим какую-то букву, уберём какую-то букву или добавим лишний символ), то результатом проверки будет false.

var str = 'year2017  m&m 5 nupber';
var reg = /year\d\d\d\d\s\sm\Sm\W\w\Wnumber/;

alert(reg.test(str)); // false

Сразу же после этого слова 'number' должно быть одна, любая цифра. Если мы в строке, напишем две цифры, то результатом проверки будет false, потому что, в регулярном выражении после слова 'number' есть только один символ класса ' \d '.

Количество цифр из строки должно соответствовать количеству символов класса(\d) в регулярном выражении.

После цифры, должен быть один пробельный символ (символ класса \s).

var str = 'year2017  m&m 5 number89 ';
var reg = /year\d\d\d\d\s\sm\Sm\W\w\Wnumber\d\s/;

alert(reg.test(str)); // false

Результат false, потому что после слова 'number' должна быть только одна цифра, это с одной стороны проверки, а с другой цифра 9 не является пробельным символом.

Если уберём цифру 9 и поставим больше одного пробела, то результат будет true. Почему ? Попробуйте сами ответить на этот вопрос.

var str = 'year2017  m&m 5 number8   ';
var reg = /year\d\d\d\d\s\sm\Sm\W\w\Wnumber\d\s/;

alert(reg.test(str)); // true

Результат также будет true, если в строке оставим цифру 9, а в регулярном выражении уберём символ класса ' \s '.

var str = 'year2017  m&m 5 number89';
var reg = /year\d\d\d\d\s\sm\Sm\W\w\Wnumber\d/;

alert(reg.test(str)); // true

И так мы поняли, что после слово 'number' должно быть одна цифра и после этой цифры должен быть один пробельный символ.

Нам остался анализировать последний символ класса ( \D ) из этого регулярного выражения. Этот символ представляет любой символ, кроме цифры.

Для примера мы написали символ процент. Можете указать любой другой символ кроме цифры.

var str = 'year2017  m&m 5 number8 3';
var reg = /year\d\d\d\d\s\sm\Sm\W\w\Wnumber\d\s\D/;

alert(reg.test(str)); // false

Результат false, потому что мы написали именно цифру. Исправляем.

var str = 'year2017  m&m 5 number8 *(DF)((&as(*&sdaf';
var reg = /year\d\d\d\d\s\sm\Sm\W\w\Wnumber\d\s\D/;

alert(reg.test(str)); // true

Ой, кажется я добавил пару лишних символов, но теперь результат стал true. Почему? Потому что достаточно чтобы часть строки соответствовала регулярному выражению, и вся строка считается соответственной.

А для того чтобы указать что после символа который не является цифрой, ничего лишнего не должно быть, в конце регулярного выражения нужно написать якорь конец строки ($).

var str = 'year2017  m&m 5 number8 *(DF)((&as(*&sdaf';
var reg = /year\d\d\d\d\s\sm\Sm\W\w\Wnumber\d\s\D$/;

alert(reg.test(str)); // false

Убираем лишние символы:

var str = 'year2017  m&m 5 number8 *';
var reg = /year\d\d\d\d\s\sm\Sm\W\w\Wnumber\d\s\D$/;

alert(reg.test(str)); // true

И результат стал true.

И на этом завершим данную статью. Думаю, мы достаточно поэкспериментировали и как результат Вы хорошо освоили материал этой статьи.

Теперь, Вы уже знаете, что такое символьные классы и что представляет каждый символ класса. Как видно из примера, каждый из них используется по необходимости.

Задачи

  1. Напишите регулярное выражение для этой строки: ' monitor 0hxdw0 d&f count732 '
  2. Придумайте самостоятельно какое-то регулярное выражение и попробуйте написать строку, которая будет соответствовать этому регулярному выражению.

Понравилась статья?

Тогда поделитесь ею с друзьями и подпишитесь на новые интересные статьи.

Поделиться с друзьями:

Подписаться на новые статьи:

Delivered by FeedBurner

Поддержите пожалуйста мой проект!

<< Предыдущая статьяСледующая статья >>

Если у Вас есть какие-то вопросы или предложения, то можете писать их в комментариях или мне на почту sergiu920@mail.ru. И если Вы заметили какую-то ошибку в статье, то прошу Вас, сообщите мне об этом, и в ближайшее время я всё исправлю.

Добавляйтесь ко мне в друзья в:

Добавляйтесь в мои группы:

Подпишитесь на мои каналы:

Автор статьи: Мунтян Сергей

Копирование материалов с сайта sozdatisite.ru ЗАПРЕЩЕНО!!!

Дата добавления: 2016-12-22 02:43:08