ЧаÑÑÑ Ñаблона можно заклÑÑиÑÑ Ð² Ñкобки (...). ÐÑо назÑваеÑÑÑ Â«ÑкобоÑÐ½Ð°Ñ Ð³ÑÑппа».
У Ñакого вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐµÑÑÑ Ð´Ð²Ð° ÑÑÑекÑа:
- ÐозволÑÐµÑ Ð¿Ð¾Ð¼ÐµÑÑиÑÑ ÑаÑÑÑ ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð² оÑделÑнÑй маÑÑив.
- ÐÑли ÑÑÑановиÑÑ ÐºÐ²Ð°Ð½ÑиÑикаÑÐ¾Ñ Ð¿Ð¾Ñле Ñкобок, Ñо он бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ ÐºÐ¾ вÑÐµÐ¼Ñ ÑодеÑÐ¶Ð¸Ð¼Ð¾Ð¼Ñ Ñкобки, а не к Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑимволÑ.
ÐÑимеÑÑ
РазбеÑÑм Ñкобки на пÑимеÑÐ°Ñ .
ÐÑимеÑ: gogogo
Ðез Ñкобок Ñаблон go+ ознаÑÐ°ÐµÑ Ñимвол g и идÑÑий поÑле него Ñимвол o, коÑоÑÑй повÑоÑÑеÑÑÑ Ð¾Ð´Ð¸Ð½ или более Ñаз. ÐапÑимеÑ, goooo или gooooooooo.
Скобки гÑÑппиÑÑÑÑ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð²Ð¼ÐµÑÑе. Так ÑÑо (go)+ ознаÑÐ°ÐµÑ go, gogo, gogogo и Ñ.п.
alert( 'Gogogo now!'.match(/(go)+/ig) ); // "Gogogo"
ÐÑимеÑ: домен
Сделаем ÑÑо-Ñо более Ñложное â ÑегÑлÑÑное вÑÑажение, коÑоÑое ÑооÑвеÑÑÑвÑÐµÑ Ð´Ð¾Ð¼ÐµÐ½Ñ ÑайÑа.
ÐапÑимеÑ:
mail.com
users.mail.com
smith.users.mail.com
Ðак видно, домен ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· повÑоÑÑÑÑÐ¸Ñ ÑÑ Ñлов, пÑиÑÑм поÑле каждого, кÑоме поÑледнего, ÑÑÐ¾Ð¸Ñ ÑоÑка.
Ðа ÑзÑке ÑегÑлÑÑнÑÑ
вÑÑажений (\w+\.)+\w+:
let regexp = /(\w+\.)+\w+/g;
alert( "site.com my.site.com".match(regexp) ); // site.com,my.site.com
ÐоиÑк ÑабоÑаеÑ, но ÑÐ°ÐºÐ¾Ð¼Ñ ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð½Ðµ ÑооÑвеÑÑÑвÑÐµÑ Ð´Ð¾Ð¼ÐµÐ½ Ñ Ð´ÐµÑиÑом, напÑимеÑ, my-site.com, Ñак как деÑÐ¸Ñ Ð½Ðµ вÑ
Ð¾Ð´Ð¸Ñ Ð² клаÑÑ \w.
Ðожно иÑпÑавиÑÑ ÑÑо, заменим \w на [\w-] везде, кÑоме как в конÑе: ([\w-]+\.)+\w+.
ÐÑимеÑ: email
ÐÑедÑдÑÑий пÑÐ¸Ð¼ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑаÑÑиÑиÑÑ, Ñоздав ÑегÑлÑÑное вÑÑажение Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка email.
ФоÑÐ¼Ð°Ñ email: имÑ@домен. РкаÑеÑÑве имени Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ñбое Ñлово, ÑазÑеÑÐµÐ½Ñ Ð´ÐµÑиÑÑ Ð¸ ÑоÑки. Ðа ÑзÑке ÑегÑлÑÑнÑÑ
вÑÑажений ÑÑо [-.\w]+.
ÐÑоговÑй Ñаблон:
let regexp = /[-.\w]+@([\w-]+\.)+[\w-]+/g;
alert("[email protected] @ [email protected]".match(regexp)); // [email protected], [email protected]
ÐÑо ÑегÑлÑÑное вÑÑажение не идеалÑное, но, как пÑавило, ÑабоÑÐ°ÐµÑ Ð¸ Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ð¸ÑпÑавлÑÑÑ Ð¾Ð¿ÐµÑаÑки. ÐконÑаÑелÑнÑÑ Ð¿ÑовеÑÐºÑ Ð¿ÑавилÑноÑÑи email, в лÑбом ÑлÑÑае, можно оÑÑÑеÑÑвиÑÑ, лиÑÑ Ð¿Ð¾Ñлав на него пиÑÑмо.
СодеÑжимое Ñкобок в match
СкобоÑнÑе гÑÑÐ¿Ð¿Ñ Ð½ÑмеÑÑÑÑÑÑ Ñлева напÑаво. ÐоиÑковÑй движок Ð·Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°ÐµÑ ÑодеÑжимое, коÑоÑое ÑооÑвеÑÑÑвÑÐµÑ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑкобоÑной гÑÑппе, и позволÑÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ ÐµÐ³Ð¾ в ÑезÑлÑÑаÑе.
ÐеÑод str.match(regexp), еÑли Ñ ÑегÑлÑÑного вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ regexp Ð½ÐµÑ Ñлага g, иÑÐµÑ Ð¿ÐµÑвое Ñовпадение и возвÑаÑÐ°ÐµÑ ÐµÐ³Ð¾ в виде маÑÑива:
- Ðа позиÑии
0бÑÐ´ÐµÑ Ð²ÑÑ Ñовпадение Ñеликом. - Ðа позиÑии
1â ÑодеÑжимое пеÑвой ÑкобоÑной гÑÑппÑ. - Ðа позиÑии
2â ÑодеÑжимое вÑоÑой ÑкобоÑной гÑÑппÑ. - â¦Ð¸ Ñак далееâ¦
ÐапÑимеÑ, Ð¼Ñ Ñ
оÑим найÑи HTML Ñеги <.*?> и обÑабоÑаÑÑ Ð¸Ñ
. ÐÑло Ð±Ñ Ñдобно имеÑÑ ÑодеÑжимое Ñега (Ñо, ÑÑо внÑÑÑи Ñголков) в оÑделÑной пеÑеменной.
ÐавайÑе заклÑÑим внÑÑÑеннее ÑодеÑжимое в кÑÑглÑе Ñкобки: <(.*?)>.
ТепеÑÑ Ð¿Ð¾Ð»ÑÑим как Ñег Ñеликом <h1>, Ñак и его ÑодеÑжимое h1 в виде маÑÑива:
let str = '<h1>Hello, world!</h1>';
let tag = str.match(/<(.*?)>/);
alert( tag[0] ); // <h1>
alert( tag[1] ); // h1
ÐложеннÑе гÑÑппÑ
Скобки могÑÑ Ð±ÑÑÑ Ð¸ вложеннÑми.
ÐапÑимеÑ, пÑи поиÑке Ñега в <span class="my"> Ð½Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð½ÑеÑеÑоваÑÑ:
- СодеÑжимое Ñега Ñеликом:
span class="my". - Ðазвание Ñега:
span. - ÐÑÑибÑÑÑ Ñега:
class="my".
ÐаклÑÑим иÑ
в Ñкобки в Ñаблоне: <(([a-z]+)\s*([^>]*))>.
ÐÐ¾Ñ Ð¸Ñ Ð½Ð¾Ð¼ÐµÑа (Ñлева напÑаво, по оÑкÑÑваÑÑей Ñкобке):
РдейÑÑвии:
let str = '<span class="my">';
let regexp = /<(([a-z]+)\s*([^>]*))>/;
let result = str.match(regexp);
alert(result[0]); // <span class="my">
alert(result[1]); // span class="my"
alert(result[2]); // span
alert(result[3]); // class="my"
Ðо нÑÐ»ÐµÐ²Ð¾Ð¼Ñ Ð¸Ð½Ð´ÐµÐºÑÑ Ð² result вÑегда идÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ðµ Ñовпадение.
ÐаÑем ÑледÑÑÑ Ð³ÑÑппÑ, нÑмеÑÑемÑе Ñлева напÑаво, по оÑкÑÑваÑÑим Ñкобкам. ÐÑÑппа, оÑкÑÑваÑÑÐ°Ñ Ñкобка коÑоÑой идÑÑ Ð¿ÐµÑвой, полÑÑÐ°ÐµÑ Ð¿ÐµÑвÑй Ð¸Ð½Ð´ÐµÐºÑ Ð² ÑезÑлÑÑаÑе â result[1]. Там наÑ
одиÑÑÑ Ð²ÑÑ ÑодеÑжимое Ñега.
ÐаÑем в result[2] идÑÑ Ð³ÑÑппа, обÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð²ÑоÑой оÑкÑÑваÑÑей Ñкобкой ([a-z]+) â Ð¸Ð¼Ñ Ñега, далее в result[3] бÑÐ´ÐµÑ Ð¾ÑÑалÑное ÑодеÑжимое Ñега: ([^>]*).
СооÑвеÑÑÑвие Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ гÑÑÐ¿Ð¿Ñ Ð² ÑÑÑоке:
ÐеобÑзаÑелÑнÑе гÑÑппÑ
Ðаже еÑли ÑкобоÑÐ½Ð°Ñ Ð³ÑÑппа необÑзаÑелÑна (напÑимеÑ, ÑÑÐ¾Ð¸Ñ ÐºÐ²Ð°Ð½ÑиÑикаÑÐ¾Ñ (...)?), ÑооÑвеÑÑÑвÑÑÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива result ÑÑÑеÑÑвÑÐµÑ Ð¸ Ñавен undefined.
ÐапÑимеÑ, ÑаÑÑмоÑÑим ÑегÑлÑÑное вÑÑажение a(z)?(c)?. Ðно иÑÐµÑ Ð±ÑÐºÐ²Ñ "a", за коÑоÑой идÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑÐ½Ð°Ñ Ð±Ñква "z", за коÑоÑой, в ÑÐ²Ð¾Ñ Ð¾ÑеÑедÑ, идÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑÐ½Ð°Ñ Ð±Ñква "c".
ÐÑли пÑимениÑÑ ÐµÐ³Ð¾ к ÑÑÑоке из одной бÑÐºÐ²Ñ a, Ñо ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ñакой:
let match = 'a'.match(/a(z)?(c)?/);
alert( match.length ); // 3
alert( match[0] ); // a (вÑÑ Ñовпадение)
alert( match[1] ); // undefined
alert( match[2] ); // undefined
ÐаÑÑив Ð¸Ð¼ÐµÐµÑ Ð´Ð»Ð¸Ð½Ñ 3, но вÑе ÑкобоÑнÑе гÑÑÐ¿Ð¿Ñ Ð¿ÑÑÑÑе.
Ð ÑепеÑÑ Ð±Ð¾Ð»ÐµÐµ ÑÐ»Ð¾Ð¶Ð½Ð°Ñ ÑиÑÑаÑÐ¸Ñ Ð´Ð»Ñ ÑÑÑоки ac:
let match = 'ac'.match(/a(z)?(c)?/)
alert( match.length ); // 3
alert( match[0] ); // ac (вÑÑ Ñовпадение)
alert( match[1] ); // undefined, поÑÐ¾Ð¼Ñ ÑÑо Ð´Ð»Ñ (z)? ниÑего неÑ
alert( match[2] ); // c
Ðлина маÑÑива вÑегда Ñавна 3. ÐÐ»Ñ Ð³ÑÑÐ¿Ð¿Ñ (z)? ниÑего неÑ, поÑÑÐ¾Ð¼Ñ ÑезÑлÑÑаÑ: ["ac", undefined, "c"].
ÐоиÑк вÑÐµÑ Ñовпадений Ñ Ð³ÑÑппами: matchAll
matchAll ÑвлÑеÑÑÑ Ð½Ð¾Ð²Ñм, Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð¿Ð¾Ð»Ð¸ÑилÐеÑод не поддеÑживаеÑÑÑ Ð² ÑÑаÑÑÑ Ð±ÑаÑзеÑÐ°Ñ .
ÐÐ¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð¿Ð¾Ð»Ð¸Ñил, напÑÐ¸Ð¼ÐµÑ https://github.com/ljharb/String.prototype.matchAll.
ÐÑи поиÑке вÑеÑ
Ñовпадений (Ñлаг g) меÑод match не возвÑаÑÐ°ÐµÑ ÑкобоÑнÑе гÑÑппÑ.
ÐапÑимеÑ, попÑобÑем найÑи вÑе Ñеги в ÑÑÑоке:
let str = '<h1> <h2>';
let tags = str.match(/<(.*?)>/g);
alert( tags ); // <h1>,<h2>
РезÑлÑÑÐ°Ñ â маÑÑив Ñовпадений, но без деÑалей о каждом. Ðо на пÑакÑике ÑкобоÑнÑе гÑÑÐ¿Ð¿Ñ Ñоже ÑаÑÑо нÑжнÑ.
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¸Ñ
полÑÑаÑÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð¼ÐµÑод str.matchAll(regexp).
Ðн бÑл добавлен в ÑзÑк JavaScript гоÑаздо позже Ñем str.match, как его Â«Ð½Ð¾Ð²Ð°Ñ Ð¸ ÑлÑÑÑеннаÑ» веÑÑиÑ.
Ðн, как и str.match(regexp), иÑÐµÑ ÑовпадениÑ, но Ñ Ð½ÐµÐ³Ð¾ еÑÑÑ ÑÑи оÑлиÑиÑ:
- Ðн возвÑаÑÐ°ÐµÑ Ð½Ðµ маÑÑив, а пеÑебиÑаемÑй обÑекÑ.
- ÐÑи поиÑке Ñ Ñлагом
g, он возвÑаÑÐ°ÐµÑ ÐºÐ°Ð¶Ð´Ð¾Ðµ Ñовпадение в виде маÑÑива Ñо ÑкобоÑнÑми гÑÑппами. - ÐÑли Ñовпадений неÑ, он возвÑаÑÐ°ÐµÑ Ð½Ðµ
null, а пÑоÑÑо пÑÑÑой пеÑебиÑаемÑй обÑекÑ.
ÐапÑимеÑ:
let results = '<h1> <h2>'.matchAll(/<(.*?)>/gi);
// results - не маÑÑив, а пеÑебиÑаемÑй обÑекÑ
alert(results); // [object RegExp String Iterator]
alert(results[0]); // undefined (*)
results = Array.from(results); // пÑевÑаÑаем в маÑÑив
alert(results[0]); // <h1>,h1 (пеÑвÑй Ñег)
alert(results[1]); // <h2>,h2 (вÑоÑой Ñег)
Ðак видиÑе, пеÑвое оÑлиÑие â оÑÐµÐ½Ñ Ð²Ð°Ð¶Ð½Ð¾Ðµ, ÑÑо демонÑÑÑиÑÑÐµÑ ÑÑÑока (*). ÐÑ Ð½Ðµ можем полÑÑиÑÑ Ñовпадение как results[0], Ñак как ÑÑÐ¾Ñ Ð¾Ð±ÑÐµÐºÑ Ð½Ðµ ÑвлÑеÑÑÑ Ð¿ÑевдомаÑÑивом. Ðго можно пÑевÑаÑиÑÑ Ð² наÑÑоÑÑий маÑÑив пÑи помоÑи Array.from. Ðолее подÑобно о пÑевдомаÑÑиваÑ
и пеÑебиÑаемÑÑ
обÑекÑов Ð¼Ñ Ð³Ð¾Ð²Ð¾Ñили в главе ÐеÑебиÑаемÑе обÑекÑÑ.
Ð Ñвном пÑеобÑазовании ÑеÑез Array.from Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи, еÑли Ð¼Ñ Ð¿ÐµÑебиÑаем ÑезÑлÑÑаÑÑ Ð² Ñикле, Ð²Ð¾Ñ Ñак:
let results = '<h1> <h2>'.matchAll(/<(.*?)>/gi);
for(let result of results) {
alert(result);
// пеÑвÑй вÑвод: <h1>,h1
// вÑоÑой: <h2>,h2
}
â¦Ðли иÑполÑзÑем деÑÑÑÑкÑÑÑизаÑиÑ:
let [tag1, tag2] = '<h1> <h2>'.matchAll(/<(.*?)>/gi);
Ðаждое Ñовпадение, возвÑаÑаемое matchAll, Ð¸Ð¼ÐµÐµÑ ÑÐ¾Ñ Ð¶Ðµ вид, ÑÑо и пÑи match без Ñлага g: ÑÑо маÑÑив Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми ÑвойÑÑвами index (позиÑÐ¸Ñ ÑовпадениÑ) и input (иÑÑ
однÑй ÑекÑÑ):
let results = '<h1> <h2>'.matchAll(/<(.*?)>/gi);
let [tag1, tag2] = results;
alert( tag1[0] ); // <h1>
alert( tag1[1] ); // h1
alert( tag1.index ); // 0
alert( tag1.input ); // <h1> <h2>
matchAll â пеÑебиÑаемÑй обÑекÑ, а не обÑÑнÑй маÑÑив?ÐаÑем Ñак Ñделано? ÐÑиÑина пÑоÑÑа â Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑии.
ÐÑи вÑзове matchAll движок JavaScript возвÑаÑÐ°ÐµÑ Ð¿ÐµÑебиÑаемÑй обÑекÑ, в коÑоÑом еÑÑ Ð½ÐµÑ ÑезÑлÑÑаÑов. ÐоиÑк оÑÑÑеÑÑвлÑеÑÑÑ Ð¿Ð¾ меÑе Ñого, как Ð¼Ñ Ð·Ð°Ð¿ÑаÑиваем ÑезÑлÑÑаÑÑ, напÑимеÑ, в Ñикле.
Таким обÑазом, бÑÐ´ÐµÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾ Ñовно ÑÑолÑко ÑезÑлÑÑаÑов, ÑколÑко нам нÑжно.
ÐапÑимеÑ, вÑего в ÑекÑÑе Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ 100 Ñовпадений, а в Ñикле поÑле 5-го ÑезÑлÑÑаÑа Ð¼Ñ Ð¿Ð¾Ð½Ñли, ÑÑо нам иÑ
доÑÑаÑоÑно и Ñделали break. Тогда движок не бÑÐ´ÐµÑ ÑÑаÑиÑÑ Ð²ÑÐµÐ¼Ñ Ð½Ð° поиÑк оÑÑалÑнÑÑ
95.
ÐменованнÑе гÑÑппÑ
ÐапоминаÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ð¿Ð¾ номеÑам не оÑÐµÐ½Ñ Ñдобно. ÐÐ»Ñ Ð¿ÑоÑÑÑÑ Ñаблонов ÑÑо допÑÑÑимо, но в ÑложнÑÑ ÑегÑлÑÑнÑÑ Ð²ÑÑажениÑÑ ÑÑиÑаÑÑ Ñкобки заÑÑÑдниÑелÑно. ÐоÑаздо лÑÑÑе â даваÑÑ Ñкобкам имена.
ÐÑо делаеÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ ?<name> непоÑÑедÑÑвенно поÑле оÑкÑÑÑÐ¸Ñ Ñкобки.
ÐапÑимеÑ, поиÑем даÑÑ Ð² ÑоÑмаÑе «год-меÑÑÑ-денÑ»:
let dateRegexp = /(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})/;
let str = "2019-04-30";
let groups = str.match(dateRegexp).groups;
alert(groups.year); // 2019
alert(groups.month); // 04
alert(groups.day); // 30
Ðак Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе видеÑÑ, гÑÑÐ¿Ð¿Ñ ÑаÑполагаÑÑÑÑ Ð² ÑвойÑÑве groups ÑезÑлÑÑаÑа match.
ЧÑÐ¾Ð±Ñ Ð½Ð°Ð¹Ñи не ÑолÑко пеÑвÑÑ Ð´Ð°ÑÑ, иÑполÑзÑем Ñлаг g.
Также нам понадобиÑÑÑ matchAll, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑкобоÑнÑе гÑÑппÑ:
let dateRegexp = /(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})/g;
let str = "2019-10-30 2020-01-01";
let results = str.matchAll(dateRegexp);
for(let result of results) {
let {year, month, day} = result.groups;
alert(`${day}.${month}.${year}`);
// пеÑвÑй вÑвод: 30.10.2019
// вÑоÑой: 01.01.2020
}
СкобоÑнÑе гÑÑÐ¿Ð¿Ñ Ð¿Ñи замене
ÐеÑод str.replace(regexp, replacement), оÑÑÑеÑÑвлÑÑÑий Ð·Ð°Ð¼ÐµÐ½Ñ Ñовпадений Ñ regexp в ÑÑÑоке str, позволÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð² ÑÑÑоке Ð·Ð°Ð¼ÐµÐ½Ñ ÑодеÑжимое Ñкобок. ÐÑо делаеÑÑÑ Ð¿Ñи помоÑи обознаÑений вида $n, где n â Ð½Ð¾Ð¼ÐµÑ ÑкобоÑной гÑÑппÑ.
ÐапÑимеÑ:
let str = "John Bull";
let regexp = /(\w+) (\w+)/;
alert( str.replace(regexp, '$2, $1') ); // Bull, John
ÐÐ»Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½ÑÑ
Ñкобок ÑÑÑлка бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ ÐºÐ°Ðº $<имÑ>.
ÐапÑимеÑ, заменим даÑÑ Ð² ÑоÑмаÑе «год-меÑÑÑ-денÑ» на «денÑ.меÑÑÑ.год»:
let regexp = /(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})/g;
let str = "2019-10-30, 2020-01-01";
alert( str.replace(regexp, '$<day>.$<month>.$<year>') );
// 30.10.2019, 01.01.2020
ÐÑклÑÑение из Ð·Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ ÑеÑез ?:
ÐÑÐ²Ð°ÐµÑ Ñак, ÑÑо Ñкобки нÑжнÑ, ÑÑÐ¾Ð±Ñ ÐºÐ²Ð°Ð½ÑиÑикаÑÐ¾Ñ Ð¿ÑавилÑно пÑименилÑÑ, но Ð¼Ñ Ð½Ðµ Ñ Ð¾Ñим, ÑÑÐ¾Ð±Ñ Ð¸Ñ ÑодеÑжимое бÑло вÑделено в ÑезÑлÑÑаÑе.
СкобоÑнÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑклÑÑиÑÑ Ð¸Ð· запоминаемÑÑ
и нÑмеÑÑемÑÑ
, добавив в ÐµÑ Ð½Ð°Ñало ?:.
ÐапÑимеÑ, еÑли Ð¼Ñ Ñ
оÑим найÑи (go)+, но не Ñ
оÑим имеÑÑ Ð² маÑÑиве-ÑезÑлÑÑаÑе оÑделÑнÑм ÑлеменÑом ÑодеÑжимое Ñкобок (go), Ñо можем напиÑаÑÑ (?:go)+.
РпÑимеÑе ниже Ð¼Ñ Ð¿Ð¾Ð»ÑÑим ÑолÑко Ð¸Ð¼Ñ John как оÑделÑнÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑовпадениÑ:
let str = "Gogogo John!";
// ?: иÑклÑÑÐ°ÐµÑ go из запоминаниÑ
let regexp = /(?:go)+ (\w+)/i;
let result = str.match(regexp);
alert( result[0] ); // Gogogo John (полное Ñовпадение)
alert( result[1] ); // John
alert( result.length ); // 2 (болÑÑе в маÑÑиве ÑлеменÑов неÑ)
Ðак видно, ÑодеÑжимое Ñкобок (?:go) не ÑÑало оÑделÑнÑм ÑлеменÑом маÑÑива result.
ÐÑого
ÐÑÑглÑе Ñкобки гÑÑппиÑÑÑÑ Ð²Ð¼ÐµÑÑе ÑаÑÑÑ ÑегÑлÑÑного вÑÑажениÑ, Ñак ÑÑо кванÑиÑикаÑÐ¾Ñ Ð¿ÑименÑеÑÑÑ Ðº ним в Ñелом.
СкобоÑнÑе гÑÑÐ¿Ð¿Ñ Ð½ÑмеÑÑÑÑÑÑ Ñлева напÑаво. Также им можно даÑÑ Ð¸Ð¼Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ (?<name>...).
ЧаÑÑÑ ÑовпадениÑ, ÑооÑвеÑÑÑвÑÑÑÑÑ ÑкобоÑной гÑÑппе, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ полÑÑиÑÑ Ð² ÑезÑлÑÑаÑÐ°Ñ Ð¿Ð¾Ð¸Ñка.
- ÐеÑод
str.matchвозвÑаÑÐ°ÐµÑ ÑкобоÑнÑе гÑÑÐ¿Ð¿Ñ ÑолÑко без Ñлагаg. - ÐеÑод
str.matchAllвозвÑаÑÐ°ÐµÑ ÑкобоÑнÑе гÑÑÐ¿Ð¿Ñ Ð²Ñегда.
ÐÑли Ñкобка не Ð¸Ð¼ÐµÐµÑ Ð¸Ð¼ÐµÐ½Ð¸, Ñо ÑодеÑжимое гÑÑÐ¿Ð¿Ñ Ð±ÑÐ´ÐµÑ Ð¿Ð¾ ÑÐ²Ð¾ÐµÐ¼Ñ Ð½Ð¾Ð¼ÐµÑÑ Ð² маÑÑиве-ÑезÑлÑÑаÑе, еÑли имееÑ, Ñо Ñакже в ÑвойÑÑве groups.
СодеÑжимое ÑкобоÑной гÑÑÐ¿Ð¿Ñ Ð¼Ð¾Ð¶Ð½Ð¾ Ñакже иÑполÑзоваÑÑ Ð¿Ñи замене str.replace(regexp, replacement): по номеÑÑ $n или по имени $<имÑ>.
Ðожно иÑклÑÑиÑÑ ÑкобоÑнÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ð¸Ð· запоминаниÑ, добавив в ÐµÑ Ð½Ð°Ñало ?:. ÐÑо иÑполÑзÑеÑÑÑ, еÑли необÑ
одимо пÑимениÑÑ ÐºÐ²Ð°Ð½ÑиÑикаÑÐ¾Ñ ÐºÐ¾ вÑей гÑÑппе, но не запоминаÑÑ Ð¸Ñ
ÑодеÑжимое в оÑделÑном ÑлеменÑе маÑÑива-ÑезÑлÑÑаÑа. Также Ð¼Ñ Ð½Ðµ можем ÑÑÑлаÑÑÑÑ Ð½Ð° Ñакие Ñкобки в ÑÑÑоке заменÑ.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)