Code Example 1: Литерал vs Конструктор
❓ В чём разница между двумя способами создания RegExp? Почему в конструкторе нужно двойное экранирование?
Литерал:
var regex = /hello world/gi;
var digits = /\d+/;
var word = /\w+/;
var slash = /\//;
Конструктор:
var regex = new RegExp('hello world', 'gi');
var digits = new RegExp('\\d+');
var word = new RegExp('\\w+');
var slash = new RegExp('/');
Code Example 2: Статические шаблоны
❓ Для каких задач лучше использовать литеральную нотацию? Что проверяют эти регулярные выражения?
var emailRegex = /^\w+@\w+\.\w+$/;
var phoneRegex = /^\d{10,11}$/;
var urlRegex = /^https?:\/\//;
emailRegex.test('user@example.com');
Code Example 3: Динамические шаблоны
❓ Зачем нужен конструктор new RegExp()? Почему здесь нельзя использовать литерал?
function findWord(text, word) {
var regex = new RegExp(word, 'gi');
return text.match(regex);
}
findWord('Hello hello HELLO', 'hello');
var searchTerm = 'JavaScript';
var regex = new RegExp(searchTerm, 'i');
regex.test('I love JavaScript');
Code Example 4: Формирование сложного шаблона
❓ Как эта функция формирует регулярное выражение из массива? Что вернёт validateExtension('photo.JPG', ['jpg', 'png', 'gif'])?
function validateExtension(filename, allowedExtensions) {
var pattern = '\\.(' + allowedExtensions.join('|') + ')$';
var regex = new RegExp(pattern, 'i');
return regex.test(filename);
}
validateExtension('photo.JPG', ['jpg', 'png', 'gif']);
validateExtension('doc.pdf', ['jpg', 'png', 'gif']);
Code Example 5: Двойное экранирование в конструкторе
❓ Почему new RegExp('\d+') создаёт не тот паттерн, который ожидается? Как это исправить?
var wrong = new RegExp('\d+');
console.log(wrong);
var correct = new RegExp('\\d+');
console.log(correct);
var literal = /\d+/;
var constructor = new RegExp('\\d+');
Code Example 6: Слеш в шаблоне
❓ Почему слеш нужно экранировать в литерале, но не нужно в конструкторе?
var urlRegex = /https:\/\//;
var urlRegex2 = new RegExp('https://');
Code Example 7: Экранирование пользовательского ввода
❓ Зачем нужна функция escapeRegExp? Что произойдёт без экранирования при поиске '$100'?
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
var userInput = 'price: $100';
var escaped = escapeRegExp(userInput);
var regex = new RegExp(escaped);
regex.test('The price: $100 is high');
Code Example 8: Создание копии RegExp с другими флагами
❓ Как создать копию регулярного выражения с изменёнными флагами? Что делает regex.source?
var original = /hello/gi;
var modified = new RegExp(original.source, 'i');
console.log(original);
console.log(modified);
Code Example 9: Производительность
❓ Почему литерал быстрее конструктора? Как оптимизировать использование конструктора?
function findWithLiteral(text) {
return /\d+/g.exec(text);
}
function findWithConstructor(text) {
return new RegExp('\\d+', 'g').exec(text);
}
var cachedRegex = new RegExp('\\d+', 'g');
function findOptimized(text) {
cachedRegex.lastIndex = 0;
return cachedRegex.exec(text);
}