ãã¿ã¼ã³ã®ä¸é¨ã丸æ¬å¼§ (...)ã§å²ããã¨ãã§ãã¾ãããã㯠âãã£ããã£ã°ã«ã¼ãâ ã¨å¼ã°ãã¦ãã¾ãã
ããã«ã¯2ã¤ã®å¹æãããã¾ã:
- çµæã®é åã®ä¸ã§ããããããé¨åãå¥ã ã®é ç®ã¨ãã¦åå¾ãããã¨ãã§ãã¾ãã
- 丸æ¬å¼§ã®å¾ã®éæå®åãããå ´åãæå¾ã®æåã§ã¯ãªãå ¨ä½ã«ä¸¸æ¬å¼§ãé©ç¨ããã¾ãã
ä¾
ä¾ã§ã©ã®ããã«ä¸¸æ¬å¼§ãåä½ãããè¦ã¦ã¿ã¾ããã:
ä¾: gogogo
æ¬å¼§ãªãã ã¨ããã¿ã¼ã³ /go+/ 㯠g ã¨ãããã«ç¶ãã¦1å以ä¸ã® o ã®ç¹°ãè¿ããæå³ãã¾ããä¾ãã°ãgoooo ã gooooooooo ã§ãã
æ¬å¼§ã¯æåãã°ã«ã¼ãåããã®ã§ã(go)+ 㯠go, gogo, gogogo etc ãæå³ãã¾ã:
alert( 'Gogogo now!'.match(/(go)+/i) ); // "Gogogo"
ä¾: domain
ãã£ã¨è¤éãªãã® â web ãµã¤ãã®ãã¡ã¤ã³ãæ¢ãæ£è¦è¡¨ç¾ãä½ãã¾ãããã
ä¾:
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-] ã«ç½®ãæãããã¨ã§å¯¾å¦ã§ãã¾ãã
ä¾: email
åã®ä¾ãæ¡å¼µã§ãã¾ããåã®ä¾ããã¼ã¹ã«ãã¦æ£è¦è¡¨ç¾ãä½ãã¾ãããã
email ã®ãã©ã¼ããã㯠name@domain ã§ããä»»æã®æåã name ã«ãªãããã¤ãã³ã¨ãããã許å¯ããã¾ããæ£è¦è¡¨ç¾ã§ã¯ [-.\w]+ ã¨ãªãã¾ãã
ãã¿ã¼ã³:
let regexp = /[-.\w]+@([\w-]+\.)+[\w-]+/g;
alert("[email protected] @ [email protected]".match(regexp)); // [email protected], [email protected]
ãã®æ£è¦è¡¨ç¾ã¯å®ç§ã§ã¯ããã¾ããããã»ã¨ãã©ã®å ´åæ©è½ãå¶çºçãªãã¹ãä¿®æ£ããã®ã«å½¹ç«ã¡ã¾ãããªããã¡ã¼ã«ã¢ãã¬ã¹ã®å¯ä¸ã®ä¿¡é ¼ã§ãããã§ãã¯ã¯éä¿¡ãããã¨ã«ãã£ã¦ã®ã¿è¡ããã¨ãã§ãã¾ãã
æ¬å¼§ã®ä¸èº«
丸æ¬å¼§ã¯å·¦ããå³ã¸çªå·ä»ãããã¾ããæ¤ç´¢ã¨ã³ã¸ã³ã¯ããããã®ä¸èº«ãè¦ãã¦ããããã¿ã¼ã³ã¾ãã¯ç½®ææååã®ä¸ã§å 容ãåç §ãããã¨ãã§ãã¾ãã
ã¡ã½ãã str.match(regexp) ã§ã¯ãregexp ã« g ãã©ã°ããªããã°æåã®ä¸è´ãæ¢ãããããé
åã¨ãã¦è¿ãã¾ã:
- ã¤ã³ããã¯ã¹
0: å®å ¨ãªä¸è´ - ã¤ã³ããã¯ã¹
1: æåã®ä¸¸æ¬å¼§ã®ä¸èº« - ã¤ã³ããã¯ã¹
2: 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 ã®ã¤ã³ããã¯ã¹ 0 ã¯å¸¸ã®ãããå
¨ä½ã«ãªãã¾ãã
次ã«ãéå§æ¬å¼§ãå·¦ããå³ã«çªå·ä»ããããã°ã«ã¼ãã«ãªãã¾ããæåã®ã°ã«ã¼ã㯠result[1] ã§è¿å´ããã¾ããããã§ã¯ã¿ã°ã®ä¸èº«å
¨ä½ã«ãªãã¾ãã
result[2] ã§ã¯2ã¤ç®ã®éå§æ¬å¼§ ([a-z]+) ã«ãããã¿ã°åãè¿ãã¾ããresult[3] 㯠([^>]*) ã«å¯¾å¿ãããã®ã§ãã
æååä¸ã®ãã¹ã¦ã®ã°ã«ã¼ãã®ä¸èº«ã§ã:
ãªãã·ã§ã³ã®ã°ã«ã¼ã
ãã¨ãã°ã«ã¼ãããªãã·ã§ã³ã§ããããããã«åå¨ããªãå ´å(ä¾. éæå®å (...)? ããã)ã§ãã対å¿ãã result ã®é
åé
ç®ã¯åå¨ã undefined ã¨ç価ã§ãã
ä¾ãã°ãæ£è¦è¡¨ç¾ a(z)?(c)? ãèãã¦ã¿ã¾ãããããã㯠"a" ã«ä»»æã® "z"ãç¶ã, ããã«ä»»æã® "c" ãç¶ããã¿ã¼ã³ãæ¢ãã¾ãã
ãã1æå 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 ã¯æ°ããã¡ã½ãããªã®ã§ polyfill ãå¿
è¦ãªå ´åãããã¾ãã¡ã½ãã matchAll ã¯å¤ããã©ã¦ã¶ã§ã¯ãµãã¼ãããã¦ãã¾ããã
https://github.com/ljharb/String.prototype.matchAll ã®ãã㪠polyfill ãå¿ è¦ãªå ´åãããã¾ãã
ãã¹ã¦ã®ä¸è´ãæ¤ç´¢ããå ´å(ãã©ã° g)ãmatch ã¡ã½ããã¯ã°ã«ã¼ãã®ä¸èº«ãè¿å´ãã¾ããã
ä¾ãã°ãæååä¸ã®ãã¹ã¦ã®ã¿ã°ãæ¢ãã¦ã¿ã¾ãããã:
let str = '<h1> <h2>';
let tags = str.match(/<(.*?)>/g);
alert( tags ); // <h1>,<h2>
çµæã¯ä¸è´ãããã®ã®é åã§ãããããããã«é¢ãã詳細ã¯å«ã¾ãã¦ãã¾ãããããããå®éã«ã¯ãé常ã¯çµæã¨ãã¦ãã£ããã£ã°ã«ã¼ãã®ä¸èº«ãå¿ è¦ã§ãã
ããããåå¾ããã«ã¯ãstr.matchAll(regexp) ã¡ã½ããã使ç¨ãã¦æ¤ç´¢ããå¿
è¦ãããã¾ãã
ããã¯ãâæ°ããæ¹è¯ããããã¼ã¸ã§ã³â ã¨ãã¦ãmatch ã®ãã£ã¨å¾ã« JavaScript è¨èªã«è¿½å ããã¾ããã
match ã®ããã«ä¸è´ãæ¢ãã¾ããã3ã¤ã®éããããã¾ã:
- é åã§ã¯ãªãå復å¯è½(iterable)ãªãã¸ã§ã¯ããè¿ãã¾ãã
- ãã©ã°
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 (1ã¤ç®ã®ã¿ã°)
alert(results[1]); // <h2>,h2 (2ã¤ç®ã®ã¿ã°)
ã覧ã®éããè¡ (*) ã§ç¤ºãã¦ããããã«1ã¤ç®ã®éãã¯é常ã«éè¦ã§ãããªãã¸ã§ã¯ãã¯çä¼¼é
åã§ã¯ãªããããresults[0] ã§ä¸è´ãããã®ãåå¾ãããã¨ã¯ã§ãã¾ãããArray.from ã使ç¨ãã¦æ¬å½ã® Array ã«ãããã¨ãã§ãã¾ããçä¼¼é
åã¨å復å¯è½ã«ã¤ãã¦ã®ãã詳細ãªå
容ã«é¢ãã¦ã¯ãå復å¯è½ãªãªãã¸ã§ã¯ã ãåç
§ãã¦ãã ããã
çµæãã«ã¼ãããå ´åã¯ã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 ã§è¿å´ããããã¹ã¦ã®ä¸è´ã¯ããã©ã° g ãªãã® match ã«ããè¿å´ããããã®ã¨åãå½¢å¼ã§ã: 追å ã®ãããã㣠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 åã®ä¸è´ãæ¢ãããã«æéãè²»ãããã«ãã¿ã¾ãã
ååä»ãã°ã«ã¼ã(Named groups)
çªå·ã§ã°ã«ã¼ããè¦ãã¦ããã®ã¯é£ããã§ããç°¡åãªãã¿ã¼ã³ã§ããã°åé¡ããã¾ããããããè¤éãªãã¿ã¼ã³ã®å ´åãæ¬å¼§ãæ°ããã®ã«ã¯ä¸ä¾¿ã§ãããã®ããã®ããè¯ããªãã·ã§ã³ãããã¾ã: æ¬å¼§ã«ååãã¤ãã¾ãã
éå§æ¬å¼§ã®ç´å¾ã«?<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}`);
// first alert: 30.10.2019
// second: 01.01.2020
}
ç½®æã«ããããã£ããã£ã°ã«ã¼ã
str å
ã® regexp ã«ãããã¹ã¦ã®ä¸è´ãç½®æããã¡ã½ãã str.replace(regexp, replacement) ã§ã¯ã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â¦)ã