JavaScript Регулярные Выражения и Объект RegExp

Здравствуйте, ambitные программисты! Сегодня мы отправимся в увлекательное путешествие в мир регулярных выражений (RegEx) в JavaScript. Не волнуйтесь, если вы никогда раньше не слышали о RegEx — мы начнем с самых азов и будем двигаться往上. К концу этого руководства вы будете использовать силу RegEx как профи!

JavaScript - RegExp

Что такое Регулярные Выражения?

Регулярные выражения, часто сокращаемые до RegEx, — это мощные инструменты для поиска и манипулирования строками. Представьте их как особый язык для описания шаблонов в тексте. Это как швейцарский армейский нож для работы со строками — универсальный и невероятно полезный!

Давайте начнем с простого примера:

let pattern = /hello/;
let text = "Hello, world!";
console.log(pattern.test(text));  // Вывод: false

В этом примере /hello/ — это наш шаблон RegEx, и мы проверяем, соответствует ли он тексту "Hello, world!". Результат false, так как RegEx по умолчанию чувствителен к регистру.

Объект RegExp

В JavaScript мы можем создавать шаблоны RegEx с помощью объекта RegExp. Вот как это делается:

let pattern1 = new RegExp("hello");
let pattern2 = /hello/;

console.log(pattern1.test("hello world"));  // Вывод: true
console.log(pattern2.test("hello world"));  // Вывод: true

Оба способа создания объекта RegExp эквивалентны. Литеральная нотация (/pattern/) используется чаще из-за своей простоты.

Модификаторы

Модификаторы позволяют нам изменять поведение шаблона RegEx. Давайте рассмотрим некоторые из распространенных модификаторов:

Модификатор Описание
i Без учета регистра
g Глобальный поиск (находит все совпадения, а не только первое)
m Многострочный поиск

Вот пример использования модификатора 'i':

let pattern = /hello/i;
let text = "Hello, World!";
console.log(pattern.test(text));  // Вывод: true

Теперь наш шаблон соответствует "Hello" независимо от регистра!

Скобки

Скобки в RegEx используются для определения набора или диапазона символов для поиска:

Скобка Описание
[abc] Совпадает с любым символом в скобках
[^abc] Совпадает с любым символом не в скобках
[0-9] Совпадает с любым digitом от 0 до 9
[a-z] Совпадает с любым малым字母ом

Давайте рассмотрим пример:

let pattern = /[aeiou]/;
console.log(pattern.test("hello"));  // Вывод: true
console.log(pattern.test("why"));    // Вывод: false

Этот шаблон совпадает с любым гласным. Он находит совпадение в "hello", но не в "why".

Квантители

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

Квантитель Описание
* 0 или более occurrences
+ 1 или более occurrences
? 0 или 1 occurrence
{n} Exactly n occurrences
{n,} n или более occurrences
{n,m} Между n и m occurrences

Вот забавный пример:

let pattern = /ba+/;
console.log(pattern.test("b"));      // Вывод: false
console.log(pattern.test("ba"));     // Вывод: true
console.log(pattern.test("baaaa"));  // Вывод: true

Этот шаблон совпадает с "ba" и любым количеством дополнительных "a". Это как блеяние овцы: "baaaa"!

Literals Characters

Literals characters в RegEx просто совпадают с собой. Например, /hello/ совпадает с exact sequence of characters "hello".

let pattern = /hello world/;
console.log(pattern.test("hello world"));  // Вывод: true
console.log(pattern.test("hello earth"));  // Вывод: false

Metacharacters

Metacharacters имеют special meanings в RegEx:

Metacharacter Description
. Совпадает с любым одним символом
\d Совпадает с любым digitом
\D Совпадает с любым non-digit
\w Совпадает с любым word character
\W Совпадает с любым non-word character
\s Совпадает с любым whitespace character
\S Совпадает с любым non-whitespace character

Давайте используем некоторые metacharacters:

let pattern = /\d{3}-\d{3}-\d{4}/;
console.log(pattern.test("123-456-7890"));  // Вывод: true
console.log(pattern.test("abc-def-ghij"));  // Вывод: false

Этот шаблон совпадает с типичным форматом US phone number.

RegExp Сvojstva

Объекты RegExp имеют несколько полезных свойств:

Свойство Описание
global Whether the "g" flag is set
ignoreCase Whether the "i" flag is set
multiline Whether the "m" flag is set
source Текст шаблона
lastIndex The index at which to start the next match

Вот как использовать эти свойства:

let pattern = /hello/gi;
console.log(pattern.global);      // Вывод: true
console.log(pattern.ignoreCase);  // Вывод: true
console.log(pattern.source);      // Вывод: "hello"

RegExp Методы

Наконец, рассмотрим некоторые методы, которые мы можем использовать с объектами RegExp:

Метод Описание
exec() Выполняет поиск совпадения в строке
test() Проверяет наличие совпадения в строке
toString() Возвращает строковое представление regexp

Вот пример использования exec():

let pattern = /\d+/g;
let text = "I have 2 apples and 3 oranges.";
let match;

while ((match = pattern.exec(text)) !== null) {
console.log(`Found ${match[0]} at index ${match.index}`);
}

// Вывод:
// Found 2 at index 7
// Found 3 at index 23

Этот код находит все числа в тексте и сообщает их позиции.

И вот мы и рассмотрели основы регулярных выражений в JavaScript. Помните, что практика делает мастера. Попробуйте создать свои шаблоны и проверьте их. Скоро вы будете использовать RegEx для решения всех sorts of string manipulation problems с легкостью!

Счастливого кодирования, и пусть ваши регулярные выражения всегда находят совпадение!

Credits: Image by storyset