RegExp.prototype.exec()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2015å¹´7æ.
exec() 㯠RegExp ã¤ã³ã¹ã¿ã³ã¹ã®ã¡ã½ããã§ãæå®ãããæååã®ä¸ã§ãã®æ£è¦è¡¨ç¾ã¨ä¸è´ãããã®ãæ¤ç´¢ãããã®çµæã®é
åãã¾ã㯠null ãè¿ãã¾ãã
試ãã¦ã¿ã¾ããã
const regex = /fo+/g;
const str = "table football, foosball";
let array;
while ((array = regex.exec(str)) !== null) {
console.log(`Found ${array[0]}. Next starts at ${regex.lastIndex}.`);
// äºæ³ãããçµæ: "Found foo. Next starts at 9."
// äºæ³ãããçµæ: "Found foo. Next starts at 19."
}
æ§æ
exec(str)
弿°
str-
æ£è¦è¡¨ç¾ã®ç §åã宿½ããæååããã¹ã¦ã®å¤ã¯æååã«å¼·å¶ããã¾ãã®ã§ãçç¥ããã
undefinedãæ¸¡ãããããã¨exec()ã¯æåå"undefined"ãæ¤ç´¢ããããã«ãªãã¾ãããããã¯æãã¨ããã§ã¯ãªãã§ãããã
è¿å¤
ç
§åã«å¤±æããå ´åã¯ã exec() ã¡ã½ãã㯠null ãè¿ãã lastIndex ã 0 ã«è¨å®ãã¾ãã
ç
§åã«æåããå ´åã exec() ã¡ã½ããã¯é
åãè¿ããæ£è¦è¡¨ç¾ãªãã¸ã§ã¯ãã® lastIndex ããããã£ãæ´æ°ãã¾ããè¿ãããé
åã¯ãä¸è´ããããã¹ããæåã®é
ç®ã¨ãã¦æã¡ããã®å¾ãä¸è´ããããã¹ãã®æ¬å¼§ã«ãããã£ããã£ã°ã«ã¼ãã«å¯¾ã㦠1 ã¤ãã¤ã®é
ç®ãæã¡ã¾ãã
index-
æååä¸ã§ä¸è´ããä½ç½®ã® 0 ããå§ã¾ãã¤ã³ããã¯ã¹ã§ãã
input-
ç §å対象ã§ãã£ãå ã®æååã§ãã
groups-
ååä»ããã£ããã£ã°ã«ã¼ãã示ã
nullãããã¿ã¤ããªãã¸ã§ã¯ãã§ããã®ãã¼ãååã¨ãªããå¤ããã£ããã£ã°ã«ã¼ããã¾ãã¯ãã£ããã£ã°ã«ã¼ããå®ç¾©ããã¦ããªããã°undefinedã§ãã詳ããã¯ãã£ããã£ã°ã«ã¼ããåç §ãã¦ãã ããã indicesçç¥å¯-
ãã®ããããã£ã¯
dãã©ã°ãè¨å®ããã¦ããå ´åã«ã®ã¿åå¨ãã¾ããããã¯é åã§ãããããã®è¦ç´ ã¯é¨åæååã®ä¸è´ããå¢çã表ãã¾ãããã®é åã®ããããã®è¦ç´ ã®ã¤ã³ããã¯ã¹ã¯exec()ãè¿ãé åã®ä¸ã®ä¸è´ããé¨åæååã®ã¤ã³ããã¯ã¹ã«å¯¾å¿ãã¾ããè¨ãæããã°ãæåã®indicesé ç®ã¯ç §åããæååå ¨ä½ã表ãã2 ã¤ç®ã®indicesé ç®ã¯æåã®ãã£ããã£ã°ã«ã¼ããªã©ã表ãã¾ããåé ç®èªèº«ã¯ 2 è¦ç´ ã®é åã§ãæåã®æ°åã¯ä¸è´ã®éå§ã¤ã³ããã¯ã¹ã表ãã2 ã¤ç®ã®æ°åã¯ãã®çµäºã¤ã³ããã¯ã¹ã表ãã¾ããé å
indicesã«ã¯ããã«groupsããããã£ãããããã¹ã¦ã®ååä»ããã£ããã£ã°ã«ã¼ãã®nullãããã¿ã¤ããªãã¸ã§ã¯ããä¿æãã¾ãããã¼ã¯ãã£ããã£ã°ã«ã¼ãã®ååã§ãããããããã®å¤ã¯ 2 ã¤è¦ç´ ã®é åã§ãæåã®æ°åã¯ãã£ããã£ã°ã«ã¼ãã®å§ããã¤ã³ããã¯ã¹ã 2 ã¤ç®ã®æ°åã¯çµããã®ã¤ã³ããã¯ã¹ã§ããæ£è¦è¡¨ç¾ã«ååä»ããã£ããã£ã°ã«ã¼ããå«ã¾ãã¦ããªãå ´åãgroupsã¯undefinedã¨ãªãã¾ãã
解説
JavaScript ã® RegExp ãªãã¸ã§ã¯ãã¯ã global ã¾ã㯠sticky ãã©ã°ãè¨å®ããã¦ããå ´åï¼ä¾ãã° /foo/g ã /foo/yï¼ã¯ã¹ãã¼ããã«ã«ãªãã¾ããããã¯ååã®ä¸è´ä½ç½®ã lastIndex ã«æ ¼ç´ãã¾ãããããå
é¨çã«ä½¿ç¨ãããã¨ã§ã exec() ã¯ããã¹ãã®æååå
ã§ï¼ãã£ããã£ã°ã«ã¼ãã®ããï¼è¤æ°ã®ä¸è´ãå復å¦çãããã¨ãã§ãã¾ããããã¯åãªãæååã®ä¸è´ãåå¾ãã String.prototype.match() ã¨ã¯å¯¾ç
§çã§ãã
exec() ã使ç¨ããå ´åãã°ãã¼ãã«ãã©ã°ã¯ sticky ãã©ã°ãè¨å®ããã¦ããã¨ãã«ã¯å½±é¿ãã¾ãããç
§åã¯å¸¸ã«ç²ççã«è¡ããã¾ãã
exec() ã¯æ£è¦è¡¨ç¾ã®ããªããã£ãã¡ã½ããã§ããä»ã®å¤ãã®æ£è¦è¡¨ç¾ã¡ã½ããã¯ãå
é¨çã« exec() ãå¼ã³åºãã¾ãããã㯠[Symbol.replace]() ã®ãããªæååã®ã¡ã½ãããããå¼ã³åºããã¾ããexec() èªä½ã¯å¼·åã§ããï¼ããã¦æãå¹ççã§ãï¼ãå¤ãã®å ´åãæãæç¢ºã«æå³ãä¼ãããã®ã§ã¯ããã¾ããã
- æ£è¦è¡¨ç¾ãæååã«ä¸è´ãããã©ããã ããå¿
è¦ã§ãå®éã«ä½ãä¸è´ããããè¦ãå¿
è¦ããªãå ´åã¯ã代ããã«
RegExp.prototype.test()ã使ç¨ãã¦ãã ããã - ã°ãã¼ãã«æ£è¦è¡¨ç¾ã®ãã¹ã¦ã®åºç¾ãæ¢ãå ´åã§ããã£ããã£ã°ã«ã¼ãã®ãããªæ
å ±ãä¸è¦ãªå ´åã¯ã代ããã«
String.prototype.match()ã使ç¨ãã¦ãã ãããããã«ãString.prototype.matchAll()ã¯ãä¸è´ããæååãå復å¦çãããã¨ã§ãï¼ãã£ããã£ã°ã«ã¼ããæã¤ï¼æååã®è¤æ°ã®é¨åã®ç §åãç°¡ç¥åããã®ã«å½¹ç«ã¡ã¾ãã - æååå
ã®ä½ç½®ã®ã¤ã³ããã¯ã¹ãç¥ãããç
§åããå ´åã¯ã代ããã«
String.prototype.search()ã¡ã½ããã使ç¨ãã¦ãã ããã
exec()ã¯ãä¸è¨ã®ãããã®æ¹æ³ã§ã容æã«å®ç¾ã§ããªãè¤éãªæä½ã«æç¨ã§ããç¹ã«ãæåã§ lastIndex ã調æ´ããå¿
è¦ãããå ´åã«é »ç¹ã«ä½¿ç¨ããã¾ããï¼String.prototype.matchAll() ã¯æ£è¦è¡¨ç¾ãã³ãã¼ãããããmatchAll ã®å復å¦çä¸ã« lastIndex ã夿´ãã¦ãå復å¦çã«ã¯å½±é¿ãã¾ãããï¼ãã®ä¸ä¾ã«ã¤ãã¦ã¯ãlastIndex ã®å·»ãæ»ã ãåç
§ãã¦ãã ããã
ä¾
>exec() ã®ä½¿ç¨
次ã®ä¾ãæ³åãã¦ã¿ã¦ãã ããã
// "quick brown" ã®å¾ã« "jumps" ãæ¥ããã®ãããã®éã®æåãç¡è¦ãã¦ä¸è´ããã¾ãã
// "brown" 㨠"jumps" ãåå¾ãã¾ãã
// 大æåã¨å°æåã¯åºå¥ãã¾ããã
const re = /quick\s(?<color>brown).+?(jumps)/dgi;
const result = re.exec("The Quick Brown Fox Jumps Over The Lazy Dog");
ãã®ã¹ã¯ãªããå®è¡å¾ã® result ã®ç¶æ
ã¯æ¬¡ã®ããã«ãªãã¾ãã
| ãããã㣠| å¤ |
|---|---|
[0] |
"Quick Brown Fox Jumps" |
[1] |
"Brown" |
[2] |
"Jumps" |
index |
4 |
indices |
[[4, 25], [10, 15], [20, 25]]groups: { color: [10, 15 ]} |
input |
"The Quick Brown Fox Jumps Over The Lazy Dog" |
groups |
{ color: "Brown" } |
ããã«å ãã¦ããã®æ£è¦è¡¨ç¾ãã°ãã¼ãã«ã§ããããã re.lastIndex 㯠25 ã«è¨å®ããã¾ãã
é£ç¶ããä¸è´ã®æ¤ç´¢
æ£è¦è¡¨ç¾ã§ g ãã©ã°ã使ç¨ããå ´åãåãæååã§æåããä¸è´ãè¦ã¤ããããã« exec() ã¡ã½ãããè¤æ°å使ããã¨ãã§ãã¾ãããã®éãæ¤ç´¢ã¯æ£è¦è¡¨ç¾ãªãã¸ã§ã¯ãã® lastIndex ããããã£ã§æå®ãããä½ç½®ã® str ã®é¨åæååããå§ã¾ãã¾ãï¼test() ã lastIndex ããããã£ã®ä½ç½®ããå§ãã¾ãï¼ããªããå¥ãªæååãæ¤ç´¢ããå ´åã§ã lastIndex ããããã£ã¯ãªã»ããããããæ¢åã® lastIndex ããæ¤ç´¢ãå§ãã¾ãã
ä¾ãã°ã次ã®ã¹ã¯ãªãããèãã¦ã¿ã¦ãã ããã
const myRe = /ab*/g;
const str = "abbcdefabh";
let myArray;
while ((myArray = myRe.exec(str)) !== null) {
let msg = `${myArray[0]} ãè¦ã¤ãã¾ããã`;
msg += `次ã®ç
§å㯠${myRe.lastIndex} ããã§ãã`;
console.log(msg);
}
ãã®ã¹ã¯ãªããã¯ä»¥ä¸ã®ããã¹ãã表示ãã¾ãã
abb ãè¦ã¤ãã¾ãããæ¬¡ã®ç §å㯠3 ããã§ãã ab ãè¦ã¤ãã¾ãããæ¬¡ã®ç §å㯠9 ããã§ãã
è¦å: ç¡éã«ã¼ãã«é¥ãè½ã¨ãç©´ãããããããã¾ãã
- æ£è¦è¡¨ç¾ãªãã©ã«ï¼ã¾ãã¯
RegExpã³ã³ã¹ãã©ã¯ã¿ã¼ï¼ãwhileæ¡ä»¶å ã«é ç½®ããªãã§ãã ãããå復å¦çãããã³ã«æ£è¦è¡¨ç¾ãå使ãããlastIndexããªã»ããããã¾ãã - ã°ãã¼ãã«ãã©ã° (
g) ãè¨å®ããã¦ãããã確èªãã¦ãã ããããããªãã¨lastIndexãé²è¡ããªããªãã¾ãã - æ£è¦è¡¨ç¾ãé·ãã¼ãã®æåï¼ä¾ãã°
/^/gmï¼ã«ä¸è´ããå¯è½æ§ãããå ´åãåãä½ç½®ã«çã¾ãã®ãé¿ããããã«ãlastIndexãæ¯åæåã§å¢ããã¦ãã ããã
é常ããã®ãããªã³ã¼ãã String.prototype.matchAll() ã§ç½®ãæãããã¨ã§ãã¨ã©ã¼ã®å¯è½æ§ãä¸ãããã¨ãã§ãã¾ãã
RegExp ãªãã©ã«ã§ã® exec() ã®ä½¿ç¨
RegExp ãªãã¸ã§ã¯ãã使ããã« exec() ã使ç¨ãããã¨ãã§ãã¾ãã
const matches = /(hello \S+)/.exec("This is a hello world!");
console.log(matches[1]);
ããã§ 'hello world!' ãå«ãã ã¡ãã»ã¼ã¸ããã°åºåãã¾ãã
仿§æ¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-regexp.prototype.exec> |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
- æ£è¦è¡¨ç¾ã¬ã¤ã
RegExp