ЧаÑÑÐ¸Ð½Ñ Ð²Ð¸ÑÐ°Ð·Ñ Ð¼Ð¾Ð¶Ð½Ð° обгоÑнÑÑи в кÑÑÐ³Ð»Ñ Ð´Ñжки (...). Це називаÑÑÑÑÑ âгÑÑпа заÑ
опленнÑâ.
Такий пÑийом Ð¼Ð°Ñ Ð´Ð²Ð° наÑлÑдки:
- ÐÑн дозволÑÑ Ð¾ÑÑимаÑи ÑаÑÑÐ¸Ð½Ñ Ð·Ð±ÑÐ³Ñ Ð² ÑкоÑÑÑ Ð¾ÐºÑемого елеменÑÑ Ð² маÑÐ¸Ð²Ñ ÑезÑлÑÑаÑÑв.
- ЯкÑо ми поÑÑавимо кванÑиÑÑкаÑÐ¾Ñ Ð¿ÑÑÐ»Ñ Ð´Ñжок, вÑн заÑÑоÑÑÑÑÑÑÑ Ð´Ð¾ вÑÑого ÑÑ Ð²Ð¼ÑÑÑÑ.
ÐÑиклади
РозглÑнемо Ñк пÑаÑÑÑÑÑ ÐºÑÑÐ³Ð»Ñ Ð´Ñжки на пÑÐ¸ÐºÐ»Ð°Ð´Ð°Ñ .
ÐÑиклад: 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
ÐопеÑеднÑй пÑиклад можна ÑозÑиÑиÑи. СпиÑаÑÑиÑÑ Ð½Ð° нÑого, ми можемо ÑÑвоÑиÑи ÑегÑлÑÑний виÑаз Ð´Ð»Ñ Ð°Ð´ÑÐµÑ ÐµÐ»ÐµÐºÑÑÐ¾Ð½Ð½Ð¾Ñ Ð¿Ð¾ÑÑи.
ФоÑÐ¼Ð°Ñ ÐµÐ»ÐµÐºÑÑÐ¾Ð½Ð½Ð¾Ñ Ð¿Ð¾ÑÑи: name@domain. Name може бÑÑи бÑдÑ-Ñким Ñловом, деÑÑÑи Ñа кÑапки допÑÑкаÑÑÑÑÑ. Ð ÑегÑлÑÑниÑ
виÑазаÑ
Ñе [-.\w]+.
ÐиÑаз Ñ Ð½Ð°ÑÑÑпним:
let regexp = /[-.\w]+@([\w-]+\.)+[\w-]+/g;
alert("my@mail.com @ his@site.com.uk".match(regexp)); // my@mail.com, his@site.com.uk
Це неÑдеалÑний ÑегÑлÑÑний виÑаз, але здебÑлÑÑого ÑобоÑий Ñа здаÑний випÑавиÑи Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¾Ð²Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸. Ðдина ÑпÑÐ°Ð²Ð´Ñ Ð½Ð°Ð´Ñйна пеÑевÑÑка елекÑÑÐ¾Ð½Ð½Ð¾Ñ Ð¿Ð¾ÑÑи â вÑдпÑавка лиÑÑа.
ÐмÑÑÑ Ð´Ñжок вÑеÑÐµÐ´Ð¸Ð½Ñ Ð·Ð±ÑгÑ
ÐÑжки нÑмеÑÑÑÑÑÑÑ Ð·Ð»Ñва напÑаво. ÐоÑÑкова ÑиÑÑема запамâÑÑовÑÑ Ð²Ð¼ÑÑÑ Ð·Ð±ÑÐ³Ñ Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ñ Ð· Ð½Ð¸Ñ Ñа дозволÑÑ Ð¾ÑÑимаÑи його вÑеÑÐµÐ´Ð¸Ð½Ñ ÑезÑлÑÑаÑÑ.
У випадкÑ, ÑкÑо regexp не мÑÑÑиÑÑ Ð¿ÑапоÑÑÑ g, меÑод str.match(regexp) ÑÑÐºÐ°Ñ Ð¿ÐµÑÑий збÑг Ñа повеÑÑÐ°Ñ Ð¹Ð¾Ð³Ð¾ Ñк маÑив:
- ÐндекÑ
0: повний збÑг. - ÐндекÑ
1: вмÑÑÑ Ð¿ÐµÑÑÐ¸Ñ Ð´Ñжок. - ÐндекÑ
2: вмÑÑÑ Ð´ÑÑÐ³Ð¸Ñ Ð´Ñжок. - â¦Ñ Ñак далÑâ¦
ÐÐ»Ñ Ð¿ÑикладÑ, ми б Ñ
оÑÑли знайÑи HTML Ñеги <.*?> Ñа обÑобиÑи ÑÑ
. ÐÑло б зÑÑÑно маÑи вмÑÑÑ ÑÐµÐ³Ñ (вÑе, Ñо вÑеÑÐµÐ´Ð¸Ð½Ñ ÐºÑÑовиÑ
дÑжок) в окÑемÑй змÑннÑй.
ÐгоÑнемо внÑÑÑÑÑнÑй вмÑÑÑ Ñ ÐºÑÑÐ³Ð»Ñ Ð´Ñжки, оÑÑ Ñак: <(.*?)>.
Ð¢ÐµÐ¿ÐµÑ Ð¼Ð¸ оÑÑимаÑмо Ñк Ñег в ÑÑÐ»Ð¾Ð¼Ñ <h1>, Ñак Ñ Ð¹Ð¾Ð³Ð¾ вмÑÑÑ h1 в оÑÑÐ¸Ð¼Ð°Ð½Ð¾Ð¼Ñ Ð¼Ð°ÑивÑ:
let str = '<h1>ÐÑÑаÑ, ÑвÑÑе!</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 Ñ Ð½Ð¾Ð²Ð¸Ð¼ меÑодом, може знадобиÑиÑÑ Ð¿Ð¾Ð»ÑÑÑлÐеÑод 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 набагаÑо пÑзнÑÑе за match в ÑкоÑÑÑ âÐ½Ð¾Ð²Ð¾Ñ Ñа покÑаÑÐµÐ½Ð¾Ñ Ð²ÐµÑÑÑÑâ.
Як Ñ match, меÑод ÑÑÐºÐ°Ñ Ð·Ð±Ñги, але з ÑÑаÑ
ÑваннÑм 3-ÑоÑ
вÑдмÑнноÑÑей:
- ÐÑн повеÑÑÐ°Ñ Ð½Ðµ маÑив, а ÑÑеÑований обâÑкÑ.
- Ðа наÑвноÑÑÑ Ð¿ÑапоÑÑÑ
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, викоÑиÑÑовÑÑÑи Array.from. ÐеÑалÑнÑÑе пÑо пÑевдомаÑиви Ñа ÑÑеÑÐ¾Ð²Ð°Ð½Ñ Ð¾Ð±âÑкÑи в ÑÑаÑÑÑ ÐÑеÑаÑÐ¸Ð²Ð½Ñ Ð¾Ð±âÑкÑи.
Ðема поÑÑеби в Array.from, ÑкÑо ми ÑиклÑÑно пÑоÑ
одимоÑÑ Ð¿Ð¾ ÑезÑлÑÑаÑам:
let results = '<h1> <h2>'.matchAll(/<(.*?)>/gi);
for(let result of results) {
alert(result);
// пеÑÑий alert: <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 не пÑоводиÑÑ Ð¿Ð¾ÑÑкÑ. ÐаÑомÑÑÑÑ, повеÑÑаÑÑÑÑÑ ÑÑеÑований обâÑкÑ, ÑпоÑаÑÐºÑ Ð±ÐµÐ· ÑезÑлÑÑаÑÑв. ÐоÑÑк пÑоводиÑÑÑÑ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ ÑÐ°Ð·Ñ Ð¼Ð¸ пÑоÑ
одимоÑÑ Ð¾Ð±âÑкÑом, напÑиклад, вÑеÑÐµÐ´Ð¸Ð½Ñ ÑиклÑ.
ТобÑо, бÑде знайдено поÑÑÑÐ±Ð½Ñ ÐºÑлÑкÑÑÑÑ ÑезÑлÑÑаÑÑв, не бÑлÑÑе.
Ðаведемо пÑиклад: поÑенÑÑйно, в ÑекÑÑÑ ÑÑнÑÑ 100 збÑгÑв, але вÑеÑÐµÐ´Ð¸Ð½Ñ ÑÐ¸ÐºÐ»Ñ for..of ми знайÑли лиÑе 5, ÑÐ¾Ð´Ñ Ð²Ð¸ÑÑÑили, Ñо ÑÑого доÑÑаÑнÑо, Ñа викликали break. Ð¢Ð¾Ð´Ñ ÑиÑÑема не виÑÑаÑаÑиме ÑÐ°Ñ Ð½Ð° поÑÑк 95 ÑнÑиÑ
збÑгÑв.
ÐÐ¼ÐµÐ½Ð¾Ð²Ð°Ð½Ñ Ð³ÑÑпи
ÐамâÑÑаÑи гÑÑпи за номеÑами важко. РпÑоÑÑими виÑазами впоÑаÑиÑÑ Ð¼Ð¾Ð¶Ð½Ð°, але з пÑдвиÑеннÑм ÑÑÐ²Ð½Ñ ÑкладноÑÑÑ ÑÐ°Ñ ÑваÑи дÑжки ÑÑÐ°Ñ Ð½ÐµÐ·ÑÑÑно. ÐÑнÑÑ ÐºÑаÑий ваÑÑанÑ: даÑи Ñмена кÑÑглим дÑжкам.
РобиÑÑÑÑ Ñе за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ ?<name> одÑÐ°Ð·Ñ Ð¿ÑÑÐ»Ñ Ð²ÑдкÑиваÑÑÐ¾Ñ Ð´Ñжки.
Ðа пÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð½Ð¸Ð¶Ñе, поÑÑкаÑмо даÑÑ Ð² ÑоÑмаÑÑ âyear-month-dayâ:
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.
Ðби зÑобиÑи поÑÑк по вÑÑÑ
даÑаÑ
, ми можемо додаÑи пÑÐ°Ð¿Ð¾Ñ 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}`);
// пеÑÑий alert: 30.10.2019
// дÑÑгий: 01.01.2020
}
ÐÑÑпи Ð·Ð°Ñ Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð·Ð°Ð¼Ñни
ÐеÑод str.replace(regexp, replacement) замÑнÑÑ Ð²ÑÑ Ð·Ð±Ñги з regexp вÑеÑÐµÐ´Ð¸Ð½Ñ str дозволÑÑ ÐºÐ¾ÑиÑÑÑваÑиÑÑ Ð²Ð¼ÑÑÑом дÑжок в ÑÑÐ´ÐºÑ replacement. Це зÑоблено за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ $n, де n â Ð½Ð¾Ð¼ÐµÑ Ð³ÑÑпи.
ÐапÑиклад,
let str = "John Bull";
let regexp = /(\w+) (\w+)/;
alert( str.replace(regexp, '$2, $1') ); // Bull, John
ÐоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° ÑÐ¼ÐµÐ½Ð¾Ð²Ð°Ð½Ñ Ð´Ñжки можливе ÑеÑез $<name>.
ÐапÑиклад, ÑеÑоÑмаÑÑÑмо даÑи з âyear-month-dayâ на âday.month.yearâ:
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 (ÑнÑиÑ
елеменÑÑв Ñ Ð¼Ð°ÑÐ¸Ð²Ñ Ð½ÐµÐ¼Ð°Ñ)
ÐÑдÑÑмки
ÐÑÑÐ³Ð»Ñ Ð´Ñжки обâÑднÑÑÑÑ Ð² гÑÑÐ¿Ñ ÑаÑÑÐ¸Ð½Ñ ÑегÑлÑÑного виÑазÑ, аби повноÑÑнно заÑÑоÑÑваÑи до Ð½ÐµÑ ÐºÐ²Ð°Ð½ÑиÑÑкаÑоÑ.
ÐÑÑпи дÑжок нÑмеÑÑÑÑÑÑÑ Ð·Ð»Ñва напÑаво Ñа за бажаннÑм можÑÑÑ Ð±ÑÑи ÑÐ¼ÐµÐ½Ð¾Ð²Ð°Ð½Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ (?<name>...).
ÐмÑÑÑ, Ñо збÑгаÑÑÑÑÑ Ð· гÑÑпоÑ, може бÑÑи оÑÑиманий в ÑезÑлÑÑаÑÐ°Ñ :
- ÐеÑод
str.matchповеÑÑÐ°Ñ Ð³ÑÑпи Ð·Ð°Ñ Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ð»Ð¸Ñе без пÑапоÑÑÑg. - ÐеÑод
str.matchAllзавжди повеÑÑÐ°Ñ Ð³ÑÑпи Ð·Ð°Ñ Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ.
ЯкÑо в дÑжок нема ÑменÑ, ÑÑ
вмÑÑÑ Ð´Ð¾ÑÑÑпний в маÑÐ¸Ð²Ñ Ð·Ð±ÑÐ³Ñ Ð·Ð° ÑÑ
номеÑом. ÐÐ¼ÐµÐ½Ð¾Ð²Ð°Ð½Ñ Ð´Ñжки Ñакож доÑÑÑÐ¿Ð½Ñ ÑеÑез влаÑÑивÑÑÑÑ groups.
Ðи Ñакож можемо викоÑиÑÑовÑваÑи вмÑÑÑ Ð´Ñжок в ÑÑÐ´ÐºÑ Ð´Ð»Ñ Ð·Ð°Ð¼Ñни в str.replace: за номеÑом $n або ÑмâÑм $<name>.
ÐÑÑÐ¿Ñ Ð¼Ð¾Ð¶Ð½Ð° виклÑÑиÑи з нÑмеÑаÑÑÑ, додавÑи ?: на ÑÑ Ð¿Ð¾ÑаÑкÑ. Цей пÑийом викоÑиÑÑовÑÑÑÑÑÑ Ð·Ð° необÑ
ÑдноÑÑÑ Ð·Ð°ÑÑоÑÑваÑи кванÑиÑÑкаÑÐ¾Ñ Ð´Ð¾ вÑÑÑÑ Ð³ÑÑпи, але без поÑви окÑемого елеменÑÑ Ð² маÑÐ¸Ð²Ñ ÑезÑлÑÑаÑÑв. Також, ми не можемо поÑилаÑиÑÑ Ð½Ð° ÑÐ°ÐºÑ Ð´Ñжки в ÑÑÐ´ÐºÑ Ð´Ð»Ñ Ð·Ð°Ð¼Ñни.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)