RegExp.prototype.exec()
åºçº¿
广æ³å¯ç¨
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
exec() æ¹æ³å¨ä¸ä¸ªæå®åç¬¦ä¸²ä¸æ§è¡ä¸ä¸ªæç´¢å¹é
ãè¿åä¸ä¸ªç»ææ°ç»æ nullã
å°è¯ä¸ä¸
const regex1 = RegExp("foo*", "g");
const str1 = "table football, foosball";
let array1;
while ((array1 = regex1.exec(str1)) !== null) {
console.log(`Found ${array1[0]}. Next starts at ${regex1.lastIndex}.`);
// Expected output: "Found foo. Next starts at 9."
// Expected output: "Found foo. Next starts at 19."
}
è¯æ³
exec(str)
åæ°
str-
è¦å¹é æ£å表达å¼çå符串ã
è¿åå¼
妿å¹é
失败ï¼exec() æ¹æ³è¿å nullï¼å¹¶å°æ£å表达å¼ç lastIndex é置为 0ã
妿å¹é
æåï¼exec() æ¹æ³è¿åä¸ä¸ªæ°ç»ï¼å¹¶æ´æ°æ£å表达å¼å¯¹è±¡ç lastIndex 屿§ãå®å
¨å¹é
æåçææ¬å°ä½ä¸ºè¿åæ°ç»ç第ä¸é¡¹ï¼ä»ç¬¬äºé¡¹èµ·ï¼åç»æ¯é¡¹é½å¯¹åºä¸ä¸ªå¹é
çæè·ç»ãæ°ç»è¿å
·æä»¥ä¸é¢å¤ç屿§ï¼
index-
å¹é å°çå符ä½äºåå§å符串çåºäº 0 çç´¢å¼å¼ã
input-
å¹é çåå§å符串ã
groups-
ä¸ä¸ªå½åæè·ç»å¯¹è±¡ï¼å ¶é®æ¯åç§°ï¼å¼æ¯æè·ç»ãè¥æ²¡æå®ä¹å½åæè·ç»ï¼å
groupsçå¼ä¸ºundefinedãåé æè·ç»ä»¥äºè§£æ´å¤ä¿¡æ¯ã indiceså¯é-
æ¤å±æ§ä» å¨è®¾ç½®äº
dæ å¿ä½æ¶åå¨ã宿¯ä¸ä¸ªæ°ç»ï¼å ¶ä¸æ¯ä¸ä¸ªå ç´ è¡¨ç¤ºä¸ä¸ªåå符串çè¾¹çãæ¯ä¸ªåå符串å¹é æ¬èº«å°±æ¯ä¸ä¸ªæ°ç»ï¼å ¶ä¸ç¬¬ä¸ä¸ªå ç´ è¡¨ç¤ºèµ·å§ç´¢å¼ï¼ç¬¬äºä¸ªå ç´ è¡¨ç¤ºç»æç´¢å¼ã
æè¿°
å¨è®¾ç½®äº global æ sticky æ å¿ä½çæ
åµä¸ï¼å¦ /foo/g æ /foo/yï¼ï¼JavaScript RegExp å¯¹è±¡æ¯æç¶æçãå®ä»¬ä¼å°ä¸æ¬¡æåå¹é
åçä½ç½®è®°å½å¨ lastIndex 屿§ä¸ãä½¿ç¨æ¤ç¹æ§ï¼exec() å¯ç¨æ¥å¯¹å个å符串ä¸ç夿¬¡å¹é
ç»æè¿è¡éæ¡çéåï¼å
æ¬æè·å°çå¹é
ï¼ï¼èç¸æ¯ä¹ä¸ï¼ String.prototype.match() åªä¼è¿åå¹é
å°çç»æã
å¨ä½¿ç¨ exec() æ¶ï¼global æ å¿ä½ä¸ä¼å¨ sticky æ å¿ä½è¢«è®¾ç½®æ¶çæï¼è match() å§ç»ä¼è®¾ç½® sticky æ å¿ä½ã
exec() æ¯æ£å表达å¼çåå§æ¹æ³ã许å¤å
¶ä»çæ£åè¡¨è¾¾å¼æ¹æ³ä¼å¨å
é¨è°ç¨ exec()ââå
æ¬ä¸äºåç¬¦ä¸²æ¹æ³ä¹ä¼è°ç¨ exec()ï¼å¦ [Symbol.replace]()ãè½ç¶ exec() æ¬èº«é常强大èåææï¼ä½å®é常ä¸è½ææ¸
æ¥å°è¡¨ç¤ºè°ç¨çç®çã
- å¦æä½ åªæ¯ä¸ºäºå¤ææ¯å¦å¹é
ï¼è¯·ä½¿ç¨
RegExp.prototype.test()æ¹æ³ä»£æ¿ã - å¦æä½ åªæ¯ä¸ºäºæ¾åºææå¹é
æ£å表达å¼çå符串èåä¸å
³å¿æè·ç»ï¼è¯·ä½¿ç¨
String.prototype.match()æ¹æ³ä»£æ¿ãæ¤å¤ï¼String.prototype.matchAll()å è®¸ä½ å¯¹å¹é 项è¿è¡è¿ä»£ï¼è¿æå©äºç®åå¹é å符串çå¤ä¸ªé¨åï¼å¸¦æå¹é ç»ï¼ã - å¦æä½ åªæ¯ä¸ºäºæ¥æ¾å¨å符串ä¸å¹é
çç´¢å¼ï¼è¯·ä½¿ç¨
String.prototype.search()æ¹æ³ä»£æ¿ã
示ä¾
>ä½¿ç¨ exec()
èè以ä¸ç¤ºä¾ï¼
// Match "quick brown" followed by "jumps", ignoring characters in between
// Remember "brown" and "jumps"
// Ignore case
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" } |
å¦å¤ï¼ç±äºæ£åè¡¨è¾¾å¼æ¯å
¨å±çï¼globalï¼ï¼re.lastIndex ä¼è¢«è®¾ç½®ä¸º 25ã
æ¥æ¾ææå¹é
彿£å表达å¼è®¾ç½® g æ å¿ä½æ¶ï¼å¯ä»¥å¤æ¬¡æ§è¡ exec æ¹æ³æ¥æ¥æ¾åä¸ä¸ªå符串ä¸çæåå¹é
ãå½ä½ è¿æ ·åæ¶ï¼æ¥æ¾å°ä»æ£å表达å¼ç lastIndex 屿§æå®çä½ç½®å¼å§ãï¼test() ä¹ä¼æ´æ° lastIndex 屿§ï¼ã注æï¼å³ä½¿åæ¬¡æ¥æ¾çåç¬¦ä¸²ä¸æ¯åæ¥æ¾å符串æ¶ï¼lastIndex ä¹ä¸ä¼è¢«éç½®ï¼å®ä¾æ§ä¼ä»è®°å½ç lastIndex å¼å§ã
ä¾å¦ï¼ä½ 使ç¨ä¸é¢çèæ¬ï¼
const myRe = /ab*/g;
const str = "abbcdefabh";
let myArray;
while ((myArray = myRe.exec(str)) !== null) {
let msg = `Found ${myArray[0]}. `;
msg += `Next match starts at ${myRe.lastIndex}`;
console.log(msg);
}
èæ¬è¿è¡ç»æå¦ä¸ï¼
Found abb. Next match starts at 3 Found ab. Next match starts at 9
è¦åï¼ä»¥ä¸æ åµä¼å¯¼è´å¹é åæä¸ä¸ªæ é循ç¯ï¼
- ä¸è¦ææ£å表达å¼åé¢éï¼æè
RegExpæé 彿°ï¼æ¾å¨whileæ¡ä»¶è¡¨è¾¾å¼éãç±äºæ¯æ¬¡è¿ä»£æ¶lastIndexç屿§é½è¢«éç½®ã - 请确ä¿è®¾ç½®äºå
¨å±ï¼
gï¼æ å¿ä½ï¼å¦ålastIndexä¸ä¼è¢«æ´æ°ã - 妿æ£å表达å¼å¯ä»¥å¹é
é¿åº¦ä¸ºé¶çå符ï¼ä¾å¦ï¼
/^/gmï¼ï¼è¯·æå¨éå¢lastIndexï¼ä»¥é¿å å ¶å§ç»å¡å¨ç¸åçä½ç½®ã
ä½ ä¹å¯ä»¥å°è¿ç±»çä»£ç æ¿æ¢ä¸º String.prototype.matchAll() 以éä½åºéçå¯è½æ§ã
ç»å RegExp åé¢éä½¿ç¨ exec()
ä½ ä¹å¯ä»¥ç´æ¥ä½¿ç¨ exec() è䏿¯å建ä¸ä¸ª RegExp 对象ï¼
const matches = /(hello \S+)/.exec("This is a hello world!");
console.log(matches[1]);
è¿è¡ä¸é¢ç代ç ï¼æ§å¶å°ä¼è¾åº 'hello world!' å符串ã
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-regexp.prototype.exec> |
æµè§å¨å ¼å®¹æ§
åè§
- JavaScript æåä¸çæ£å表达å¼ç« è
RegExp