Регулярний вираз (або regex) - це послідовність символів, яку ми можемо використовувати, щоб знаходити та змінювати певні елементи в рядках тексту (англ. string). Отже, ми можемо:
💡 Реалізація регулярних виразів у JavaScript є частиною стандарту ECMA-262 для цієї мови. Це означає, що нам не потрібно турбуватися про сумісність із конкретним браузером.
У JavaScript регулярний вираз здебільшого записують у форматі /pattern/modifiers.
Ми маємо два способи створити регулярний вираз:
const regex = /[a-z]/;
const regex = new RegExp('[a-z]');
В обох випадках JavaScript створює з регулярного виразу обʼєкт. Рекомендується використовувати незмінні шаблони, надаючи перевагу літералу.
Конструктор RegExp стане в пригоді в тих випадках, коли регулярний вираз змінюватиметься або коли ми його ще не знаємо (наприклад, це вхідні дані).
Регулярні вирази мають необовʼязкові «суперсили» під назвою flags, які додають нові можливості.
Деякі з найуживаніших:
/g - глобальний пошук/i - без урахування регістру/m - багаторядковий пошукОсь простий приклад:
const re = /home/gi;
const str = 'Home, sweet home.';
const myArray = str.match(re);
console.log(myArray);
=> // ["Home", "home"]
Символ g дає нам змогу знайти всі можливі збіги в рядку тексту. Без цього прапорця JavaScript витягнув би лише перший збіг Home.
Прапорець /i (без урахування регістру) дає нам змогу гнучко шукати шаблон. Завдяки цьому не має значення, шукаємо ми щось у UPPERCASE чи lowercase.
Коли ми використовуємо конструктор RegExp, синтаксис додавання прапорців інший.
let regex = /[a-z]/gi; // literal notation
let regex = new RegExp('[a-z]', 'gi'); // constructor with string pattern as first argument
let regex = new RegExp(/[a-z]/, 'gi'); // constructor with regular expression literal as first argument (Starting with ECMAScript 6)
Коли регулярні вирази поєднують із вбудованими функціями JavaScript, ми отримуємо потужні способи опрацьовувати рядки тексту й діставати з них дані.
Ось деякі з найпоширеніших функцій, які використовують разом із регулярними виразами.
Метод test() виконує пошук збігу між регулярним виразом і заданим рядком тексту. Повертає правду або неправду.
const str = 'It is difficult to test if you have a virus';
const result = /virus$/.test(str);
console.log(result);
// => true
За допомогою методу match() ми отримуємо корисний масив, вміст якого залежить від наявності або відсутності знайдених збігів.
У такий спосіб ми можемо і шукати, і витягувати інформацію з будь-якого рядка тексту. Наприклад:
const funnyQuote =
'If you see someone crying, ask if it is because of their haircut.';
const regex1 = /someone/;
const regex2 = /happy/;
funnyQuote.match(regex1);
// => ["someone", index: 11, input: "If you see someone crying, ask if it is because of their haircut.", groups: undefined]
funnyQuote.match(regex2);
// => null
Коли присутній прапорець глобального пошуку /g, замість єдиного збігу разом із корисною інформацією, як-от індекс або вхідні дані, метод повертає всі входження, показані в масиві:
const funnyQuote =
'If you see someone crying, ask if it is because of their haircut.';
const regex3 = /if/gi;
funnyQuote.match(regex3);
// => ["If", "if"];
Метод replace() у JavaScript дає нам змогу шукати значення в заданому рядку тексту й замінювати його на потрібне нове значення.
string.replace(searchValue, newValue);
Шаблоном для пошуку заміни може бути один рядок тексту або регулярний вираз.
let string = 'I like dogs!';
let result = string.replace('dogs', 'cats');
let string = 'I would love to travel to Japan';
let result = string.replace(/Japan/g, 'Hawaii');
Крім того, на місце заміни можна застосувати функцію, щоб додатково змінити кожне значення.
let text = 'Say hello to the chatbot.';
let result = text.replace(/chatbot|hello/gi, function (word) {
return word.toUpperCase();
});
// => "Say HELLO to the CHATBOT"
Метод split() у JavaScript дає інший спосіб використовувати регулярні вирази для роботи з рядками тексту.
У такий спосіб ми використовуємо регулярний вираз, щоб розділити заданий рядок тексту за шаблоном, наприклад str.split(/[,.\s]/). Цей шаблон використовуватиметься як separator.
const str = 'hello,user.how are.you';
const result = str.split(/[,.\s]/);
console.log(result);
// => ['hello', 'user', 'how', 'are', 'you']
Нас найняли спеціалістом із регулярних виразів у компанії, яка розробляє Chatbot.
Це лише початковий етап розробки, тож наше завдання - використати регулярні вирази, щоб Chatbot краще розумів природну мову та вмів її генерувати.
Chatbot не лише розумний, а й відданий помічник.
Щоб поставити запитання, користувач має сказати слово «Chatbot» на першій позиції команди.
Неважливо, чи ключове слово написане великими літерами, чи малими. Важлива тут саме позиція слова.
Реалізуйте функцію isValidCommand(), за допомогою якої Chatbot розпізнає, коли користувач дає команду.
isValidCommand("Chatbot, play a song from the 80's.";
// => True
isValidCommand("Hey Chatbot, where is the closest pharmacy?";
// => False
isValidCommand("CHATBOT, do you have a solution for this challenge?";
// => True
Chatbot непросто розуміє, як люди використовують емодзі, щоб виражати свої емоції.
Коли Chatbot отримує повідомлення від користувача, кожне емодзі подане як «emoji», після чого йде його id.
Реалізуйте метод removeEmoji(), який приймає рядок тексту (англ. string) і прибирає з повідомлення все шифрування емодзі.
Рядки, у яких немає тексту емодзі, повертаються без змін.
Просто видаліть цей рядок з емодзі. Не намагайтеся коригувати пробіли.
У цьому завданні для створення регулярного виразу використайте синтаксис конструктора.
removeEmoji("I love playing videogames emoji3465 it's one of my hobbies");
// => "I love playing videogames it's one of my hobbies"
Оскільки можливості Chatbot можна завантажити в мобільний застосунок, під час розмови користувач має ввести номер телефону.
Проблема в тому, що Chatbot уміє прочитати й перевірити лише номер певного формату.
Якщо номер коректний (відповідає послідовності символів, заданій регулярним виразом), Chatbot відповідає повідомленням, у якому дякує користувачеві й підтверджує номер. Якщо номер некоректний, функція повідомляє користувачеві, що номер телефону неправильний.
Очікуваний формат такий: (+##) ###-###-###
checkPhoneNumber('(+34) 659-771-594');
// => "Thanks! You can now download me to your phone."
checkPhoneNumber('659-771-594');
// => "Oops, it seems like I can't reach out to 659-771-594"
Chatbot - дуже допитлива програма. Хоча він уміє шукати в інтернеті інформацію на певну тему, йому подобається розпитувати користувачів про цікаві вебсайти чи URL-адреси, де можна знайти потрібні відомості.
Приклад розмови:
Реалізуйте функцію getURL(), яка повертає масив, що містить лише посилання на кожен вебсайт. Написати регулярний вираз, який розпізнає будь-яку URL-адресу, було б дуже складно, але Chatbot має читати лише прості URL-адреси. У цій вправі URL-адреса - це будь-яка послідовність слів, розділених ".".
getURL(
'I learned a lot from exercism.org and developer.mozilla.org, but I found ts39.es very boring!',
);
// => ["exercism.org", "developer.mozilla.org", "ts39.es"];
Щоб зберігати дані про всіх, із ким він спілкувався, Chatbot уміє взяти повне імʼя з профілю користувача в такому вигляді: «smith, john».
Так ми хочемо, щоб наш Chatbot був по-справжньому ввічливим і справляв гарне враження.
Напишіть функцію niceToMeetYou(), яка приймає рядок тексту з повним іменем користувача й повертає рядок «Nice to meet you, John Smith»
Для навчання реалізуйте функцію за допомогою методу заміни з регулярних виразів.
let str = 'Smith, John';
niceToMeetYou(str);
// => "Nice to meet you, John Smith"
Зареєструйтеся на Exercism, щоб вивчати й опановувати JavaScript, а також 37 концепцій159 вправ та справжнє наставництво від людей, і все це безкоштовно.