éè¯ï¼*ã+ã?ã{n}ã{n,}ã{n,m}
åºçº¿
广æ³å¯ç¨
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
éè¯ä¼å°ååéå¤ä¸å®ç次æ°ãéè¯è¢«ç½®äºå ¶éç¨çåå项ä¹åã
è¯æ³
// 贪婪
atom?
atom*
atom+
atom{count}
atom{min,}
atom{min,max}
// é贪婪
atom??
atom*?
atom+?
atom{count}?
atom{min,}?
atom{min,max}?
åæ°
atom-
å个åå项ã
count-
éè´æ´æ°ï¼åååºå½è¢«éå¤ç次æ°ã
min-
éè´æ´æ°ï¼ååå¯ä»¥è¢«éå¤çæå°æ¬¡æ°ã
maxå¯é-
éè´æ´æ°ï¼ååå¯ä»¥è¢«éå¤çæå¤§æ¬¡æ°ã妿çç¥è¯¥åæ°ï¼åå坿 ¹æ®éè¦éå¤å¤æ¬¡ã
æè¿°
éè¯ä½äºåå项ä¹åï¼ç¨äºå°åå项éå¤ä¸å®æ¬¡æ°ãå®ä¸è½åç¬åºç°ãæ¯ä¸ªéè¯é½å¯ä»¥æå®ä¸ä¸ªæ¨¡å¼å¿ é¡»éå¤çæå°åæå¤§æ¬¡æ°ã
| éè¯ | æå°å¼ | æå¤§å¼ |
|---|---|---|
? |
0 | 1 |
* |
0 | Infinity |
+ |
1 | Infinity |
{count} |
count |
count |
{min,} |
min |
Infinity |
{min,max} |
min |
max |
å¯¹äº {count}ã{min,} å {min,max} è¯æ³ï¼æ°åå¨å´ä¸è½æç©ºæ ¼ï¼å¦åå°±ä¼åæåé¢å符模å¼ã
const re = /a{1, 3}/;
re.test("aa"); // false
re.test("a{1, 3}"); // true
è¿ç§è¡ä¸ºå¨ Unicode æç¥æ¨¡å¼ä¸å¾å°äºä¿®æ£ï¼å¨è¿ç§æ¨¡å¼ä¸ï¼å¦æä¸ä½¿ç¨è½¬ä¹è¯æ³ï¼å°±ä¸è½æå颿æä½¿ç¨å¤§æ¬å·ãå¨ä¸ä½¿ç¨è½¬ä¹çæ
åµä¸æå颿æä½¿ç¨ { å } çç¹æ§æ¯ä¸ç§ä¸ºä¸ web å
¼å®¹èåºå¼çè¯æ³ï¼ä¸åºä¾èµè¿ç§ç¹æ§ã
/a{1, 3}/u; // SyntaxError: Invalid regular expression: Incomplete quantifier
妿æå°å¼å¤§äºæå¤§å¼ï¼ä¼äº§çè¯æ³é误ã
/a{3,2}/; // SyntaxError: Invalid regular expression: numbers out of order in {} quantifier
éè¯å¯å¯¼è´æè·ç»å¤æ¬¡å¹é ãæå ³è¿ç§æ åµä¸çè¡ä¸ºçæ´å¤ä¿¡æ¯ï¼è¯·åé æè·ç»é¡µé¢ã
æ¯æ¬¡éå¤å¹é çå符串ä¸å¿ ç¸åã
/[ab]*/.exec("aba"); // ['aba']
é»è®¤æ
åµä¸ï¼éè¯æ¯è´ªå©ªçï¼è¿æå³çå®ä»¬ä¼å°è¯å°½å¯è½å¤å°å¹é
ï¼ç´å°è¾¾å°æå¤§å¼ææ æ³ç»§ç»å¹é
为æ¢ãä½ å¯ä»¥å¨éè¯å颿·»å ?ï¼ä½¿å
¶æä¸ºé贪婪éè¯ãå¨è¿ç§æ
åµä¸ï¼éè¯ä¼å°½éåå°å¹é
次æ°ï¼åªæå½éå¤å¹é
次æ°è¾¾å°ä¸å¯è½å¹é
å°æ¨¡å¼çå
¶ä½é¨åæ¶ï¼æä¼å¢å å¹é
次æ°ã
/a*/.exec("aaa"); // ['aaa']ï¼æ´ä¸ªè¾å
¥è¢«æ¶è
/a*?/.exec("aaa"); // ['']ï¼å¯ä»¥ä¸æ¶èä»»ä½å符ï¼ä½ä»è½æåå¹é
/^a*?$/.exec("aaa"); // ['aaa']ï¼ä¸å¯è½æ¶èæ´å°çå符èä»ç¶å¹é
æå
ä¸è¿ï¼åªè¦æ£å表达å¼å¨æä¸ªç´¢å¼å¤æåå¹é å符串ï¼å°±ä¸ä¼åå°è¯åç»ç´¢å¼ï¼å°½ç®¡è¿å¯è½ä¼å¯¼è´æ¶èæ´å°çå符ã
/a*?$/.exec("aaa"); // ['aaa']ï¼å¨ç¬¬ä¸ä¸ªå符å¤å·²ç»å¹é
æåï¼å æ¤è¯¥æ£å表达å¼ä¸ä¼å°è¯ä»ç¬¬äºä¸ªå符å¤å¼å§å¹é
å¦ææ æ³ä¸æ¨¡å¼çå ¶ä½é¨åå¹é ï¼è´ªå©ªéè¯å¯è½ä¼å°è¯è¾å°çéå¤ã
/[ab]+[abc]c/.exec("abbc"); // ['abbc']
卿¬ä¾ä¸ï¼[ab]+ é¦å
贪婪å°å¹é
äº "abb"ï¼ä½ [abc]c æ æ³å¹é
模å¼çå
¶ä½é¨åï¼"c"ï¼ï¼å æ¤éè¯è¢«ç®å为åªå¹é
"ab"ã
贪婪çéå符é¿å
å¹é
æ éå¤ç空å符串ã妿å¹é
çå符æ°è¾¾å°æå°å¼ï¼ä¸ååå¨è¯¥ä½ç½®ä¸åæ¶èæ´å¤å符ï¼é£ä¹éåå¨å°±ä¼åæ¢å¹é
ãè¿å°±æ¯ä¸ºä»ä¹ /(a*)*/.exec("b") ä¸ä¼å¯¼è´æ é循ç¯ã
贪婪çéè¯ä¼å°½å¯è½å¤å°å¹é
ï¼èä¸ä¼æå¤§åå¹é
çé¿åº¦ãä¾å¦ï¼/(aa|aabaac|ba)*/.exec("aabaac") å
å¹é
"aa"ï¼ç¶åå¹é
"ba" è䏿¯ "aabaac"ã
éè¯éç¨äºå个ååã妿è¦å¯¹è¾é¿çæ¨¡å¼æéæ©è¡¨è¾¾å¼è¿è¡éåï¼å¿ é¡»å¯¹å ¶è¿è¡åç»ãéè¯ä¸è½ç¨äºæè¨ã
/^*/; // SyntaxError: Invalid regular expression: nothing to repeat
å¨ Unicode æç¥æ¨¡å¼ä¸ï¼ååæè¨å¯ä»¥éåãè¿æ¯ä¸ç§ä¸ºå ¼å®¹ web èè¿æ¶çè¯æ³ï¼ä¸åºä¾èµå®ã
/(?=a)?b/.test("b"); // trueï¼ååå¹é
äºé¶æ¬¡
示ä¾
>ç§»é¤ HTML æ ç¾
ä¸é¢ç示ä¾å é¤äºç¨è§æ¬å¼§æ¬èµ·æ¥ç HTML æ è®°ã请注æä½¿ç¨ ? 以é¿å
䏿¬¡å é¤è¿å¤å符ã
function stripTags(str) {
return str.replace(/<.+?>/g, "");
}
stripTags("<p><em>lorem</em> <strong>ipsum</strong></p>"); // 'lorem ipsum'
使ç¨è´ªå©ªå¹é
å¯ä»¥è¾¾å°åæ ·çææï¼ä½ä¸å
许é夿¨¡å¼ä¸ > å¹é
ã
function stripTags(str) {
return str.replace(/<[^>]+>/g, "");
}
stripTags("<p><em>lorem</em> <strong>ipsum</strong></p>"); // 'lorem ipsum'
è¦åï¼ä»¥ä¸æ¹æ³ä»
便¼ç¤ºââ宿 æ³å¤ç屿§å¼ä¸ç >ã请使ç¨åéç HTML ååå¨ã
å®ä½ Markdown 段è½
å¨ Markdown ä¸ï¼æ®µè½ç±ä¸ä¸ªæå¤ä¸ªç©ºè¡åéãä¸é¢ç示ä¾éè¿å¹é 两个æå¤ä¸ªæ¢è¡ç¬¦æ¥è®¡ç®å符串ä¸çæææ®µè½ã
function countParagraphs(str) {
return str.match(/(?:\r?\n){2,}/g).length + 1;
}
countParagraphs(`
Paragraph 1
Paragraph 2
Containing some line breaks, but still the same paragraph
Another paragraph
`); // 3
è¦åï¼ä»¥ä¸æ¹æ³ä» 便¼ç¤ºââ宿 æ³å¤ç代ç åæå ¶ä» Markdown åå ç´ ï¼å¦æ é¢ï¼ä¸çæ¢è¡ç¬¦ã请使ç¨åéç Markdown è§£æå¨ã
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # prod-Quantifier> |