模å¼çä¸é¨åå¯ä»¥ç¨æ¬å·æ¬èµ·æ¥ (...)ãè¿è¢«ç§°ä¸ºâæè·ç»ï¼capturing groupï¼âã
è¿æä¸¤ä¸ªå½±åï¼
- å®å 许å°å¹é çä¸é¨åä½ä¸ºç»ææ°ç»ä¸çåç¬é¡¹ã
- 妿æä»¬å°éè¯æ¾å¨æ¬å·åï¼åå®å°æ¬å·è§ä¸ºä¸ä¸ªæ´ä½ã
示ä¾
让æä»¬ççå¨ç¤ºä¾ä¸çæ¬å·æ¯å¦ä½å·¥ä½çã
示ä¾ï¼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+ã
示ä¾ï¼çµåé®ä»¶
æ©å±ä¸ä¸ä¸é¢è¿ä¸ªç¤ºä¾ãæä»¬å¯ä»¥åºäºå®ä¸ºçµåé®ä»¶å建ä¸ä¸ªæ£å表达å¼ã
çµåé®ä»¶çæ ¼å¼ä¸ºï¼name@domainãåç§°å¯ä»¥æ¯ä»»ä½åè¯ï¼å
许使ç¨è¿å符åç¹ã卿£å表达å¼ä¸ä¸º [-.\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å¤ï¼ç¬¬äºä¸ªæ¬å·çå 容ã - â¦â¦ççâ¦â¦
ä¾å¦ï¼æä»¬æ³æ¾å° 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]ï¼ä»ç¬¬äºä¸ªå·¦æ¬å·å¼å§åç» ([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 æ¯ä¸ä¸ªæ°æ¹æ³ï¼å¯è½éè¦ä½¿ç¨ polyfillæ§çæµè§å¨ä¸æ¯æ matchAllã
å¯è½éè¦è¿è¡ polyfillï¼ä¾å¦ 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) è¿è¡æç´¢ã
å¨ä½¿ç¨ match å¾é¿ä¸æ®µæ¶é´åï¼å®æè¢«ä½ä¸ºâæ°çæ¹è¿çæ¬â被å å
¥å° JavaScript ä¸ã
å°±å 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.from æå®åæä¸ä¸ªçæ£ç Arrayãå¨ Iterable objectï¼å¯è¿ä»£å¯¹è±¡ï¼ 䏿䏿å
³äºä¼ªæ°ç»åå¯è¿ä»£å¯¹è±¡çæ´å¤è¯¦ç»å
容ã
妿æä»¬åªéè¦éåç»æï¼å 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 è¿åçæ¯ä¸ªå¹é
项ï¼ä¸ä¸å¸¦ä¿®é¥°ç¬¦ 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 个å¹é
ã
å½åç»
ç¨æ°åè®°å½ç»å¾å°é¾ã对äºç®åçæ¨¡å¼ï¼å®æ¯å¯è¡çï¼ä½å¯¹äºæ´å¤æç模å¼ï¼è®¡ç®æ¬å·å¾ä¸æ¹ä¾¿ãæä»¬æä¸ä¸ªæ´å¥½çéæ©ï¼ç»æ¬å·å½åã
å¨å·¦æ¬å·åç´§è·çæ¾ç½® ?<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 ä¸ 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â¦ï¼