РегÑлÑÑнÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ â моÑное ÑÑедÑÑво поиÑка и Ð·Ð°Ð¼ÐµÐ½Ñ Ð² ÑÑÑоке.
Ð JavaScript ÑегÑлÑÑнÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ Ð¾ÑделÑнÑм обÑекÑом RegExp и инÑегÑиÑÐ¾Ð²Ð°Ð½Ñ Ð² меÑÐ¾Ð´Ñ ÑÑÑок.
РегÑлÑÑнÑе вÑÑажениÑ
РегÑлÑÑное вÑÑажение (оно же «ÑегÑкÑп», «ÑегÑлÑÑка» или пÑоÑÑо «Ñег»), ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· Ñаблона (Ñакже говоÑÑÑ Â«Ð¿Ð°ÑÑеÑн») и необÑзаÑелÑнÑÑ Ñлагов.
СÑÑеÑÑвÑÐµÑ Ð´Ð²Ð° ÑинÑакÑиÑа Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑегÑлÑÑного вÑÑажениÑ.
«ÐлиннÑй» ÑинÑакÑиÑ:
regexp = new RegExp("Ñаблон", "Ñлаги");
â¦Ð коÑоÑкий ÑинÑакÑиÑ, иÑполÑзÑÑÑий ÑлеÑи "/":
regexp = /Ñаблон/; // без Ñлагов
regexp = /Ñаблон/gmi; // Ñ Ñлагами gmi (бÑдÑÑ Ð¾Ð¿Ð¸ÑÐ°Ð½Ñ Ð´Ð°Ð»ÐµÐµ)
СлеÑи /.../ говоÑÑÑ JavaScript о Ñом, ÑÑо ÑÑо ÑегÑлÑÑное вÑÑажение. Ðни игÑаÑÑ Ð·Ð´ÐµÑÑ ÑÑ Ð¶Ðµ ÑолÑ, ÑÑо и кавÑÑки Ð´Ð»Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑÑÑок.
РегÑлÑÑное вÑÑажение regexp в обоиÑ
ÑлÑÑаÑÑ
ÑвлÑеÑÑÑ Ð¾Ð±ÑекÑом вÑÑÑоенного клаÑÑа RegExp.
ÐÑÐ½Ð¾Ð²Ð½Ð°Ñ ÑазниÑа Ð¼ÐµÐ¶Ð´Ñ ÑÑими двÑÐ¼Ñ ÑпоÑобами ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°ÐºÐ»ÑÑаеÑÑÑ Ð² Ñом, ÑÑо ÑлеÑи /.../ не допÑÑкаÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
вÑÑавок пеÑеменнÑÑ
(наподобие возможнÑÑ
в ÑÑÑокаÑ
ÑеÑез ${...}). Ðни полноÑÑÑÑ ÑÑаÑиÑнÑ.
СлеÑи иÑполÑзÑÑÑÑÑ, когда Ð¼Ñ Ð½Ð° Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð° ÑоÑно знаем, каким бÑÐ´ÐµÑ ÑегÑлÑÑное вÑÑажение â и ÑÑо болÑÑинÑÑво ÑиÑÑаÑий. Ð new RegExp â когда Ð¼Ñ Ñ
оÑим ÑоздаÑÑ ÑегÑлÑÑное вÑÑажение «на леÑÑ» из динамиÑеÑки ÑгенеÑиÑованной ÑÑÑоки, напÑимеÑ:
let tag = prompt("Ðакой Ñег Ð²Ñ Ñ
оÑиÑе найÑи?", "h2");
let regexp = new RegExp(`<${tag}>`); // Ñо же, ÑÑо /<h2>/ пÑи оÑвеÑе "h2" на prompt вÑÑе
Флаги
РегÑлÑÑнÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¸Ð¼ÐµÑÑ Ñлаги, коÑоÑÑе влиÑÑÑ Ð½Ð° поиÑк или пÑедоÑÑавлÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ.
Ð JavaScript Ð¸Ñ Ð²Ñего ÑемÑ:
i- С ÑÑим Ñлагом поиÑк не завиÑÐ¸Ñ Ð¾Ñ ÑегиÑÑÑа: Ð½ÐµÑ ÑазниÑÑ Ð¼ÐµÐ¶Ð´Ñ
Aиa(Ñм. пÑÐ¸Ð¼ÐµÑ Ð½Ð¸Ð¶Ðµ). g- С ÑÑим Ñлагом поиÑк иÑÐµÑ Ð²Ñе ÑовпадениÑ, без него â ÑолÑко пеÑвое.
m- ÐногоÑÑÑоÑнÑй Ñежим (ÑаÑÑмаÑÑиваеÑÑÑ Ð² главе ÐногоÑÑÑоÑнÑй Ñежим ÑкоÑей ^ $, Ñлаг "m").
s- ÐклÑÑÐ°ÐµÑ Ñежим «dotall», пÑи коÑоÑом ÑоÑка
.Ð¼Ð¾Ð¶ÐµÑ ÑооÑвеÑÑÑвоваÑÑ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¿ÐµÑевода ÑÑÑоки\n(ÑаÑÑмаÑÑиваеÑÑÑ Ð² главе СимволÑнÑе клаÑÑÑ). u- ÐклÑÑÐ°ÐµÑ Ð¿Ð¾Ð»Ð½ÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Ð®Ð½Ð¸ÐºÐ¾Ð´Ð°. Флаг ÑазÑеÑÐ°ÐµÑ ÐºÐ¾ÑÑекÑнÑÑ Ð¾Ð±ÑабоÑÐºÑ ÑÑÑÑогаÑнÑÑ Ð¿Ð°Ñ (подÑобнее об ÑÑом в главе Юникод: Ñлаг "u" и клаÑÑ \p{...}).
y- Режим поиÑка на конкÑеÑной позиÑии в ÑекÑÑе (опиÑан в главе ÐоиÑк на заданной позиÑии, Ñлаг "y").
d- С ÑÑим Ñлагом ÑезÑлÑÑÐ°Ñ ÑегÑлÑÑного вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¼ÐµÑаеÑÑÑ Ð² маÑÑив, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑегÑлÑÑном вÑÑажении, напÑÐ¸Ð¼ÐµÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð½Ð°Ñала и конÑа подÑÑÑок. ÐÑÐ¾Ñ Ñлаг не менÑÐµÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ ÑегÑлÑÑного вÑÑажениÑ, а лиÑÑ Ð¿ÑедоÑÑавлÑÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ.
ÐдеÑÑ Ð¸ далее в ÑекÑÑе иÑполÑзÑеÑÑÑ ÑледÑÑÑÐ°Ñ ÑвеÑÐ¾Ð²Ð°Ñ ÑÑ ÐµÐ¼Ð°:
- ÑегÑлÑÑное вÑÑажение â
кÑаÑнÑй - ÑÑÑока (Ñам где пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾Ð¸Ñк) â
Ñиний - ÑезÑлÑÑÐ°Ñ â
зелÑнÑй
ÐоиÑк: str.match
Ðак Ñже говоÑилоÑÑ, иÑполÑзование ÑегÑлÑÑнÑÑ Ð²ÑÑажений инÑегÑиÑовано в меÑÐ¾Ð´Ñ ÑÑÑок.
ÐеÑод str.match(regexp) Ð´Ð»Ñ ÑÑÑоки str возвÑаÑÐ°ÐµÑ ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ñ ÑегÑлÑÑнÑм вÑÑажением regexp.
У него еÑÑÑ ÑÑи Ñежима ÑабоÑÑ:
-
ÐÑли Ñ ÑегÑлÑÑного вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÐµÑÑÑ Ñлаг
g, Ñо он возвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив вÑÐµÑ Ñовпадений:let str = "ÐÑбо, бÑаÑÑÑ, лÑбо!"; alert( str.match(/лÑбо/gi) ); // ÐÑбо,лÑбо (маÑÑив из 2Ñ Ð¿Ð¾Ð´ÑÑÑок-Ñовпадений)ÐбÑаÑиÑе внимание: Ð½Ð°Ð¹Ð´ÐµÐ½Ñ Ð¸
ÐÑбоилÑбо, благодаÑÑ ÑлагÑi, коÑоÑÑй Ð´ÐµÐ»Ð°ÐµÑ ÑегÑлÑÑное вÑÑажение ÑегиÑÑÑонезавиÑимÑм. -
ÐÑли Ñакого Ñлага неÑ, Ñо возвÑаÑÐ°ÐµÑ ÑолÑко пеÑвое Ñовпадение в виде маÑÑива, в коÑоÑом по индекÑÑ
0Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ñовпадение, и еÑÑÑ ÑвойÑÑва Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной инÑоÑмаÑией о нÑм:let str = "ÐÑбо, бÑаÑÑÑ, лÑбо!"; let result = str.match(/лÑбо/i); // без Ñлага g alert( result[0] ); // ÐÑбо (пеÑвое Ñовпадение) alert( result.length ); // 1 // ÐополниÑелÑÐ½Ð°Ñ Ð¸Ð½ÑоÑмаÑиÑ: alert( result.index ); // 0 (позиÑÐ¸Ñ ÑовпадениÑ) alert( result.input ); // ÐÑбо, бÑаÑÑÑ, лÑбо! (иÑÑ Ð¾Ð´Ð½Ð°Ñ ÑÑÑока)Ð ÑÑом маÑÑиве могÑÑ Ð±ÑÑÑ Ð¸ дÑÑгие индекÑÑ, кÑоме
0, еÑли ÑаÑÑÑ ÑегÑлÑÑного вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð²Ñделена в Ñкобки. ÐÑ ÑазбеÑÑм ÑÑо в главе СкобоÑнÑе гÑÑппÑ. -
Ð, наконеÑ, еÑли Ñовпадений неÑ, Ñо, вне завиÑимоÑÑи Ð¾Ñ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ Ñлага
g, возвÑаÑаеÑÑÑnull.ÐÑо оÑÐµÐ½Ñ Ð²Ð°Ð¶Ð½Ñй нÑанÑ. ÐÑи оÑÑÑÑÑÑвии Ñовпадений возвÑаÑаеÑÑÑ Ð½Ðµ пÑÑÑой маÑÑив, а именно
null. ÐÑли об ÑÑом забÑÑÑ, можно легко допÑÑÑиÑÑ Ð¾ÑибкÑ, напÑимеÑ:let matches = "JavaScript".match(/HTML/); // = null if (!matches.length) { // ÐÑибка: Ñ null Ð½ÐµÑ ÑвойÑÑва length alert("ÐÑибка в ÑÑÑоке вÑÑе"); }ÐÑли Ñ Ð¾ÑеÑÑÑ, ÑÑÐ¾Ð±Ñ ÑезÑлÑÑаÑом вÑегда бÑл маÑÑив, можно напиÑаÑÑ Ñак:
let matches = "JavaScript".match(/HTML/) || []; if (!matches.length) { alert("Совпадений неÑ"); // ÑепеÑÑ ÑабоÑÐ°ÐµÑ }
Ðамена: str.replace
ÐеÑод str.replace(regexp, replacement) заменÑÐµÑ ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ñ regexp в ÑÑÑоке str на replacement (вÑе, еÑли еÑÑÑ Ñлаг g, инаÑе ÑолÑко пеÑвое).
ÐапÑимеÑ:
// без Ñлага g
alert( "We will, we will".replace(/we/i, "I") ); // I will, we will
// Ñ Ñлагом g
alert( "We will, we will".replace(/we/ig, "I") ); // I will, I will
Ð ÑÑÑоке Ð·Ð°Ð¼ÐµÐ½Ñ replacement Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ÑпеÑиалÑнÑе комбинаÑии Ñимволов Ð´Ð»Ñ Ð²ÑÑавки ÑÑагменÑов ÑовпадениÑ:
| СпеÑÑÐ¸Ð¼Ð²Ð¾Ð»Ñ | ÐейÑÑвие в ÑÑÑоке Ð·Ð°Ð¼ÐµÐ½Ñ |
|---|---|
$& |
вÑÑавлÑÐµÑ Ð²ÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ð½Ð¾Ðµ Ñовпадение |
$` |
вÑÑавлÑÐµÑ ÑаÑÑÑ ÑÑÑоки до ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ |
$' |
вÑÑавлÑÐµÑ ÑаÑÑÑ ÑÑÑоки поÑле ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ |
$n |
еÑли n ÑÑо 1-2 знаÑное ÑиÑло, вÑÑавлÑÐµÑ ÑодеÑжимое n-й ÑкобоÑной гÑÑÐ¿Ð¿Ñ ÑегÑлÑÑного вÑÑажениÑ, болÑÑе об ÑÑом в главе СкобоÑнÑе гÑÑÐ¿Ð¿Ñ |
$<name> |
вÑÑавлÑÐµÑ ÑодеÑжимое ÑкобоÑной гÑÑÐ¿Ð¿Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ name, Ñакже изÑÑим в главе СкобоÑнÑе гÑÑÐ¿Ð¿Ñ |
$$ |
вÑÑавлÑÐµÑ Ñимвол "$" |
ÐÑÐ¸Ð¼ÐµÑ Ñ $&:
alert( "ÐÑÐ±Ð»Ñ HTML".replace(/HTML/, "$& и JavaScript") ); // ÐÑÐ±Ð»Ñ HTML и JavaScript
ÐÑовеÑка: regexp.test
ÐеÑод regexp.test(str) пÑовеÑÑеÑ, еÑÑÑ Ð»Ð¸ Ñ
оÑÑ Ð¾Ð´Ð½Ð¾ Ñовпадение, еÑли да, Ñо возвÑаÑÐ°ÐµÑ true, инаÑе false.
let str = "Я ÐÑÐлЮ JavaScript";
let regexp = /лÑблÑ/i;
alert( regexp.test(str) ); // true
Ðалее в ÑÑом Ñазделе Ð¼Ñ Ð±Ñдем изÑÑаÑÑ ÑегÑлÑÑнÑе вÑÑажениÑ, Ñвидим еÑÑ Ð¼Ð½Ð¾Ð³Ð¾ пÑимеÑов Ð¸Ñ Ð¸ÑполÑзованиÑ, а Ñакже познакомимÑÑ Ñ Ð´ÑÑгими меÑодами.
ÐÐ¾Ð»Ð½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑазлиÑнÑÑ Ð¼ÐµÑÐ¾Ð´Ð°Ñ Ð´Ð°Ð½Ð° в главе ÐеÑÐ¾Ð´Ñ RegExp и String.
ÐÑого
- РегÑлÑÑное вÑÑажение ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· Ñаблона и необÑзаÑелÑнÑÑ
Ñлагов:
g,i,m,u,s,y,d. - Ðез Ñлагов и ÑпеÑиалÑнÑÑ Ñимволов, коÑоÑÑе Ð¼Ñ Ð¸Ð·ÑÑим позже, поиÑк по ÑегÑлÑÑÐ½Ð¾Ð¼Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñен поиÑÐºÑ Ð¿Ð¾Ð´ÑÑÑоки.
- ÐеÑод
str.match(regexp)иÑÐµÑ ÑовпадениÑ: вÑе, еÑли еÑÑÑ Ñлагg, инаÑе ÑолÑко пеÑвое. - ÐеÑод
str.replace(regexp, replacement)заменÑÐµÑ ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ñregexpнаreplacement: вÑе, еÑли Ñ ÑегÑлÑÑного вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÐµÑÑÑ Ñлагg, инаÑе ÑолÑко пеÑвое. - ÐеÑод
regexp.test(str)возвÑаÑаеÑtrue, еÑли еÑÑÑ Ñ Ð¾ÑÑ Ð¾Ð´Ð½Ð¾ Ñовпадение, инаÑеfalse.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)