Класи і спецсимволи регулярних виразів

  1. Класи і спецсимволи регулярних виразів Доброго дня! продовжуємо розглядати Регулярні вирази ...
  2. Кордон слова \ b
  3. Зворотні класи регулярних виразів
  4. Прогалини - звичайні символи
  5. Точка - це будь-який символ
  6. Екранування спеціальних символів
  7. Разом
  8. завдання

Класи і спецсимволи регулярних виразів

Доброго дня Доброго дня! продовжуємо розглядати Регулярні вирази . Ми вже з вами розібрали патерни регулярних виразів , а також методи регулярних виразів . І в цьому уроці ми з вами познайомимося з спецісмволамі і класами регулярних виразів. Розглянемо таку ось завдання - припустимо є телефонний номер «+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. »

Якщо ви знайшли помилку, будь ласка, виділіть фрагмент тексту і натисніть Ctrl + Enter.

також читайте