æ£å表达å¼
æ£åè¡¨è¾¾å¼æ¯ç¨äºå¹é
å符串ä¸å符ç»åçæ¨¡å¼ãå¨ JavaScript ä¸ï¼æ£å表达å¼ä¹æ¯å¯¹è±¡ãè¿äºæ¨¡å¼è¢«ç¨äº RegExp ç exec å test æ¹æ³ï¼ä»¥å String ç matchãmatchAllãreplaceãsearch å split æ¹æ³ãæ¬ç« ä»ç» JavaScript æ£å表达å¼ã
å建ä¸ä¸ªæ£å表达å¼
ä½ å¯ä»¥ä½¿ç¨ä»¥ä¸ä¸¤ç§æ¹æ³æå»ºä¸ä¸ªæ£å表达å¼ï¼
使ç¨ä¸ä¸ªæ£å表达å¼åé¢éï¼å ¶ç±å å«å¨ææ ä¹é´ç模å¼ç»æï¼å¦ä¸æç¤ºï¼
var re = /ab+c/;
èæ¬å è½½åï¼æ£å表达å¼åé¢éå°±ä¼è¢«ç¼è¯ã彿£å表达å¼ä¿æä¸åæ¶ï¼ä½¿ç¨æ¤æ¹æ³å¯è·å¾æ´å¥½çæ§è½ã
æè
è°ç¨RegExp对象çæé 彿°ï¼å¦ä¸æç¤ºï¼
var re = new RegExp("ab+c");
å¨èæ¬è¿è¡è¿ç¨ä¸ï¼ç¨æé 彿°åå»ºçæ£å表达å¼ä¼è¢«ç¼è¯ã妿æ£å表达å¼å°ä¼æ¹åï¼æè å®å°ä¼ä»ç¨æ·è¾å ¥çæ¥æºä¸å¨æå°äº§çï¼å°±éè¦ä½¿ç¨æé 彿°æ¥å建æ£å表达å¼ã
ç¼åä¸ä¸ªæ£å表达å¼ç模å¼
ä¸ä¸ªæ£åè¡¨è¾¾å¼æ¨¡å¼æ¯ç±ç®åçåç¬¦æææçï¼æ¯å¦ /abc/ï¼æè
æ¯ç®ååç¹æ®å符çç»åï¼æ¯å¦ /ab*c/ æ /Chapter (\d+)\.\d*/ãæåçä¾åä¸ç¨å°äºæ¬å·ï¼å®å¨æ£å表达å¼ä¸å¸¸ç¨ä½è®°å¿è®¾å¤ãå³è¿é¨åæå¹é
çå符å°ä¼è¢«è®°ä½ä»¥å¤åç»ä½¿ç¨ï¼ä¾å¦ä½¿ç¨æ¬å·çåå符串å¹é
ã
使ç¨ç®å模å¼
ç®åæ¨¡å¼æ¯ç±ä½ æ³ç´æ¥æ¾å°çå符ææãæ¯å¦ï¼/abc/ è¿ä¸ªæ¨¡å¼å°±è½ä¸ä»
è½å¹é
"abc" å符æç
§é¡ºåºåæ¶åºç°çæ
åµãä¾å¦å¨ "Hi, do you know your abc's?" å "The latest airplane designs evolved from slabcraft." ä¸ä¼å¹é
æåãå¨ä¸è¿°ä¸¤ä¸ªä¾åä¸ï¼å¹é
çååç¬¦ä¸²æ¯ "abc"ã使¯å¨ "Grab crab" ä¸ä¼å¹é
失败ï¼å 为å®è½ç¶å
å«åå符串 "ab c"ï¼ä½å¹¶ä¸æ¯åç¡®ç "abc"ã
使ç¨ç¹æ®å符
å½ä½ éè¦å¹é
ä¸ä¸ªä¸ç¡®å®çå符串æ¶ï¼æ¯å¦å¯»æ¾ä¸ä¸ªæå¤ä¸ª "b"ï¼æè
寻æ¾ç©ºæ ¼ï¼å¯ä»¥å¨æ¨¡å¼ä¸ä½¿ç¨ç¹æ®åç¬¦ãæ¯å¦ï¼ä½ å¯ä»¥ä½¿ç¨ /ab*c/ å»å¹é
ä¸ä¸ªåç¬ç "a" åé¢è·äºé¶ä¸ªæè
å¤ä¸ª "b"ï¼åæ¶åé¢è·ç "c" çå符串ï¼*çæææ¯åä¸é¡¹åºç°é¶æ¬¡æè
夿¬¡ãå¨å符串 "cbbabbbbcdebc" ä¸ï¼è¿ä¸ªæ¨¡å¼å¹é
äºåå符串 "abbbbc"ã
ä¸é¢ç页é¢ä¸è¡¨æ ¼ååºäºä¸ä¸ªæ£å表达å¼ä¸å¯ä»¥å©ç¨çç¹æ®å符ç宿´å表åæè¿°ã
- æè¨æå
-
表示ä¸ä¸ªå¹é å¨æäºæ¡ä»¶ä¸åçãæè¨å å«å è¡æè¨ãåè¡æè¨åæ¡ä»¶è¡¨è¾¾å¼ã
- å符类æå
-
åºåä¸åç±»åçå符ï¼ä¾å¦åºå忝忰åã
- ç»åååå¼ç¨æå
-
å½ä½¿ç¨æ£åè¡¨è¾¾å¼æ¨¡å¼ä¸å符串å¹é æ¶ï¼ç»ä¼å°å¤ä¸ªæ¨¡å¼ç»åæä¸ä¸ªæ´ä½ï¼æè·ç»ä¼æä¾é¢å¤çåå¹é ä¿¡æ¯ãååå¼ç¨æçæ¯å䏿£å表达å¼ä¸ä»¥åæè·çç»ã
- éè¯æå
-
表示å¹é çå符æè¡¨è¾¾å¼çæ°éã
| å符 | å«ä¹ |
|---|---|
\
|
ä¾ç §ä¸åè§åå¹é ï¼ å¨éç¹æ®å符ä¹åçåææ 表示ä¸ä¸ä¸ªå符æ¯ç¹æ®å符ï¼ä¸è½æç §åé¢çè§£ãä¾å¦ï¼å颿²¡æ "\" ç "b" é常å¹é å°å忝 "b"ï¼å³å符ä¼è¢«ä½ä¸ºåé¢çè§£ï¼æ 论å®åºç°å¨åªéãä½å¦æåé¢å äº "\"ï¼å®å°ä¸åå¹é ä»»ä½å符ï¼èæ¯è¡¨ç¤ºä¸ä¸ªå符边çã å¨ç¹æ®å符ä¹åçåææ 表示ä¸ä¸ä¸ªåç¬¦ä¸æ¯ç¹æ®å符ï¼åºè¯¥æç §åé¢çè§£ã详æ 请åé 䏿ä¸ç "转ä¹ï¼Escapingï¼" é¨åã
å¦æä½ æ³å°åç¬¦ä¸²ä¼ éç» RegExp
æé 彿°ï¼ä¸è¦å¿è®°å¨å符串åé¢éä¸åææ æ¯è½¬ä¹å符ãæä»¥ä¸ºäºå¨æ¨¡å¼ä¸æ·»å ä¸ä¸ªåææ ï¼ä½ éè¦å¨å符串åé¢éä¸è½¬ä¹å®ã |
^
|
å¹é è¾å ¥çå¼å§ã妿å¤è¡æ å¿è¢«è®¾ç½®ä¸º trueï¼é£ä¹ä¹å¹é æ¢è¡ç¬¦åç´§è·çä½ç½®ã
ä¾å¦ï¼
å½ ' |
$
|
å¹é è¾å ¥çç»æã妿å¤è¡æ å¿è¢«è®¾ç½®ä¸º trueï¼é£ä¹ä¹å¹é æ¢è¡ç¬¦åçä½ç½®ã
ä¾å¦ï¼ |
*
|
å¹é
åä¸ä¸ªè¡¨è¾¾å¼ 0 次æå¤æ¬¡ãçä»·äº
ä¾å¦ï¼ |
+
|
å¹é
åé¢ä¸ä¸ªè¡¨è¾¾å¼ 1 次æè
夿¬¡ãçä»·äº
ä¾å¦ï¼ |
?
|
å¹é
åé¢ä¸ä¸ªè¡¨è¾¾å¼ 0 次æè
1 次ãçä»·äº
ä¾å¦ï¼
å¦æç´§è·å¨ä»»ä½éè¯ *ã +ã? æ {} çåé¢ï¼å°ä¼ä½¿éè¯å为é贪婪ï¼å¹é
å°½éå°çå符ï¼ï¼å缺ç使ç¨ç贪婪模å¼ï¼å¹é
å°½å¯è½å¤çåç¬¦ï¼æ£å¥½ç¸åãä¾å¦ï¼å¯¹
"123abc" 使ç¨
è¿ç¨äºå
è¡æè¨ä¸ï¼å¦æ¬è¡¨ç |
.
|
ï¼å°æ°ç¹ï¼é»è®¤å¹é 餿¢è¡ç¬¦ä¹å¤çä»»ä½å个å符ã
ä¾å¦ï¼
妿 |
(x)
|
åä¸é¢çä¾åå±ç¤ºç飿 ·ï¼å®ä¼å¹é 'x' å¹¶ä¸è®°ä½å¹é 项ãå ¶ä¸æ¬å·è¢«ç§°ä¸ºæè·æ¬å·ã
æ¨¡å¼ |
(?:x)
|
å¹é
'x'
使¯ä¸è®°ä½å¹é
项ãè¿ç§æ¬å·å«ä½éæè·æ¬å·ï¼ä½¿å¾ä½ è½å¤å®ä¹ä¸æ£å表达å¼è¿ç®ç¬¦ä¸èµ·ä½¿ç¨çå表达å¼ãççè¿ä¸ªä¾å
|
x(?=y)
|
å¹é 'x'ä» ä» å½'x'åé¢è·ç'y'.è¿ç§å«åå è¡æè¨ã ä¾å¦ï¼/Jack(?=Sprat)/ä¼å¹é å°'Jack'ä» å½å®åé¢è·ç'Sprat'ã/Jack(?=Sprat|Frost)/å¹é âJackâä» å½å®åé¢è·ç'Sprat'æè æ¯âFrostâã使¯âSpratâåâFrostâé½ä¸æ¯å¹é ç»æçä¸é¨åã |
(?<=y)x
|
å¹é 'x'ä» å½'x'å颿¯'y'.è¿ç§å«ååè¡æè¨ã ä¾å¦ï¼/(?<=Jack)Sprat/ä¼å¹é å°' Sprat 'ä» ä» å½å®å颿¯' Jack 'ã/(?<=Jack|Tom)Sprat/å¹é âSprat âä» ä» å½å®å颿¯'Jack'æè æ¯âTomâã使¯âJackâåâTomâé½ä¸æ¯å¹é ç»æçä¸é¨åã |
x(?!y)
|
ä» ä» å½'x'åé¢ä¸è·ç'y'æ¶å¹é 'x'ï¼è¿è¢«ç§°ä¸ºæ£åå¦å®æ¥æ¾ã ä¾å¦ï¼ä» ä» å½è¿ä¸ªæ°åå颿²¡æè·å°æ°ç¹çæ¶åï¼/\d+(?!\.)/ å¹é ä¸ä¸ªæ°åãæ£å表达å¼/\d+(?!\.)/.exec("3.141") å¹é â141âè䏿¯â3.141â |
(?<!y)x
|
ä» ä» å½'x'åé¢ä¸æ¯'y'æ¶å¹é 'x'ï¼è¿è¢«ç§°ä¸ºååå¦å®æ¥æ¾ã
ä¾å¦ï¼ä»
ä»
å½è¿ä¸ªæ°åå颿²¡æè´å·çæ¶åï¼ |
x|y
|
å¹é âxâæè âyâã ä¾å¦ï¼/green|red/å¹é âgreen appleâä¸çâgreenâåâred appleâä¸çâredâ |
{n}
|
n æ¯ä¸ä¸ªæ£æ´æ°ï¼å¹é
äºåé¢ä¸ä¸ªå符å好åºç°äº n æ¬¡ã æ¯å¦ï¼ /a{2}/ ä¸ä¼å¹é âcandyâä¸ç'a',使¯ä¼å¹é âcaandyâ䏿æç aï¼ä»¥åâcaaandyâä¸çå两个'a'ã |
{n,}
|
n æ¯ä¸ä¸ªæ£æ´æ°ï¼å¹é åä¸ä¸ªå符è³å°åºç°äº n 次ã ä¾å¦ï¼/a{2,}/ å¹é "aa", "aaaa" å "aaaaa" 使¯ä¸å¹é "a"ã |
{n,m}
|
n å m 齿¯æ´æ°ãå¹é åé¢çå符è³å° n æ¬¡ï¼æå¤ m 次ã妿 n æè m ç弿¯ 0ï¼è¿ä¸ªå¼è¢«å¿½ç¥ã ä¾å¦ï¼/a{1, 3}/ å¹¶ä¸å¹é âcndyâä¸çä»»æå符ï¼å¹é âcandyâä¸ç aï¼å¹é âcaandyâä¸çå两个 aï¼ä¹å¹é âcaaaaaaandyâä¸çåä¸ä¸ª aãæ³¨æï¼å½å¹é âcaaaaaaandyâæ¶ï¼å¹é ç弿¯âaaaâï¼å³ä½¿åå§çåç¬¦ä¸²ä¸ææ´å¤ç aã |
[xyz]
|
ä¸ä¸ªå符éåãå¹é
æ¹æ¬å·ä¸çä»»æå符ï¼å
æ¬è½¬ä¹åºåãä½ å¯ä»¥ä½¿ç¨ç ´æå·ï¼-ï¼æ¥æå®ä¸ä¸ªå符èå´ã对äºç¹ï¼.ï¼åæå·ï¼*ï¼è¿æ ·çç¹æ®ç¬¦å·å¨ä¸ä¸ªå符é䏿²¡æç¹æ®çæä¹ãä»ä»¬ä¸å¿
è¿è¡è½¬ä¹ï¼ä¸è¿è½¬ä¹ä¹æ¯èµ·ä½ç¨çã ä¾å¦ï¼[abcd] å [a-d] æ¯ä¸æ ·çãä»ä»¬é½å¹é "brisket"ä¸çâbâ,ä¹é½å¹é âcityâä¸çâcâã/[a-z.]+/ å/[\w.]+/ä¸å符串âtest.i.ngâå¹é ã |
[^xyz]
|
ä¸ä¸ªååå符éãä¹å°±æ¯è¯´ï¼ å®å¹é 任使²¡æå å«å¨æ¹æ¬å·ä¸çå符ãä½ å¯ä»¥ä½¿ç¨ç ´æå·ï¼-ï¼æ¥æå®ä¸ä¸ªå符èå´ã任使®éå符å¨è¿é齿¯èµ·ä½ç¨çã ä¾å¦ï¼[^abc] å [^a-c] æ¯ä¸æ ·çãä»ä»¬å¹é "brisket"ä¸çârâï¼ä¹å¹é âchopâä¸çâhâã |
[\b]
|
å¹é ä¸ä¸ªéæ ¼ (U+0008)ãï¼ä¸è¦å\bæ··æ·äºãï¼ |
\b
|
å¹é ä¸ä¸ªè¯çè¾¹çãä¸ä¸ªè¯çè¾¹çå°±æ¯ä¸ä¸ªè¯ä¸è¢«å¦å¤ä¸ä¸ªâåâå符è·éçä½ç½®æè åé¢è·å ¶ä»âåâå符çä½ç½®ï¼ä¾å¦å¨åæ¯åç©ºæ ¼ä¹é´ã注æï¼å¹é ä¸ä¸å æ¬å¹é çåè¾¹çãæ¢å¥è¯è¯´ï¼ä¸ä¸ªå¹é çè¯çè¾¹ççå 容çé¿åº¦æ¯ 0ãï¼ä¸è¦å [\b] æ··æ·äºï¼
使ç¨"moon"举ä¾ï¼ 夿³¨ï¼ JavaScript çæ£å表达å¼å¼æå°ç¹å®çå符éå®ä¹ä¸ºâåâå符ãä¸å¨è¯¥éåä¸çä»»ä½å符é½è¢«è®¤ä¸ºæ¯ä¸ä¸ªæè¯ãè¿ç»å符ç¸å½æéï¼å®åªå æ¬å¤§ååå°åçç½é©¬åæ¯ï¼åè¿å¶æ°ååä¸å线å符ãä¸å¹¸çæ¯ï¼éè¦çå符ï¼ä¾å¦âéâæâüâï¼è¢«è§ä¸ºæè¯ã |
\B
|
å¹é ä¸ä¸ªéåè¯è¾¹çãå¹é å¦ä¸å ç§æ åµï¼
ä¾å¦ï¼/\B../å¹é "noonday"ä¸ç'oo', è/y\B../å¹é "possibly yesterday"ä¸çâyesâ |
\cX
|
å½ X æ¯å¤äº A å° Z ä¹é´çåç¬¦çæ¶åï¼å¹é å符串ä¸çä¸ä¸ªæ§å¶ç¬¦ã ä¾å¦ï¼ |
\d
|
å¹é
ä¸ä¸ªæ°å
ä¾å¦ï¼ |
\D
|
å¹é
ä¸ä¸ªéæ°åå符
ä¾å¦ï¼ |
\f
|
å¹é ä¸ä¸ªæ¢é¡µç¬¦ (U+000C)ã |
\n
|
å¹é ä¸ä¸ªæ¢è¡ç¬¦ (U+000A)ã |
\r
|
å¹é ä¸ä¸ªå车符 (U+000D)ã |
\s
|
å¹é
ä¸ä¸ªç©ºç½å符ï¼å
æ¬ç©ºæ ¼ãå¶è¡¨ç¬¦ãæ¢é¡µç¬¦åæ¢è¡ç¬¦ãçä»·äº
ä¾å¦ï¼ ç»æµè¯ï¼\sä¸å¹é "\u180e"ï¼å¨å½åçæ¬ Chrome(v80.0.3987.122) å Firefox(76.0.1) æ§å¶å°è¾å ¥/\s/.test("\u180e") åè¿å falseã |
\S
|
å¹é
ä¸ä¸ªé空ç½å符ãçä»·äº
ä¾å¦ï¼ |
\t
|
å¹é ä¸ä¸ªæ°´å¹³å¶è¡¨ç¬¦ (U+0009)ã |
\v
|
å¹é ä¸ä¸ªåç´å¶è¡¨ç¬¦ (U+000B)ã |
\w
|
å¹é
ä¸ä¸ªååå符ï¼åæ¯ãæ°åæè
ä¸å线ï¼ãçä»·äº
ä¾å¦ï¼ |
\W
|
å¹é
ä¸ä¸ªéååå符ãçä»·äº
ä¾å¦ï¼ |
\n
|
卿£å表达å¼ä¸ï¼å®è¿åæåç第 n 个åæè·å¹é çåå符串 (æè·çæ°ç®ä»¥å·¦æ¬å·è®¡æ°)ã
æ¯å¦ |
\0
|
å¹é
NULLï¼U+0000ï¼å符ï¼ä¸è¦å¨è¿åé¢è·å
¶ä»å°æ°ï¼å 为
\0<digits> æ¯ä¸ä¸ªå
«è¿å¶è½¬ä¹åºåã
|
\xhh
|
å¹é ä¸ä¸ªä¸¤ä½åå è¿å¶æ°ï¼\x00-\xFFï¼è¡¨ç¤ºçå符ã |
\uhhhh
|
å¹é ä¸ä¸ªåä½åå è¿å¶æ°è¡¨ç¤ºç UTF-16 代ç åå ã |
|
|
ï¼ä» å½è®¾ç½®äº u æ å¿æ¶ï¼å¹é ä¸ä¸ªåå è¿å¶æ°è¡¨ç¤ºç Unicode å符ã |
Escaping
å¦æä½ éè¦ä½¿ç¨ä»»ä½ç¹æ®å符çåé¢å¼ï¼ä¾å¦ï¼æç´¢å符'*'ï¼ï¼ä½ å¿
é¡»éè¿å¨å®å颿¾ä¸ä¸ªåææ æ¥è½¬ä¹å®ãä¾å¦ï¼è¦æç´¢'a'åè·'*'åè·'b'ï¼ä½ åºè¯¥ä½¿ç¨/a\*b/- åææ â转ä¹âå符'*'ï¼ä½¿å
¶æä¸ºæåèéç¹æ®ç¬¦å·ã
类似å°ï¼å¦æä½ æ£å¨ç¼åæ£åè¡¨è¾¾å¼æåå¹¶ä¸éè¦å¹é
ææ ï¼'/'ï¼ï¼é£ä¹éè¦è½¬ä¹å®ï¼å¦åï¼ææ æ¯æ£åç»æ¢ç¬¦ï¼ãä¾å¦ï¼è¦æç´¢å符串â/ example /âåè·ä¸ä¸ªæå¤ä¸ªåæ¯å符ï¼ä½ éè¦ä½¿ç¨/\/example\/[a-z]+/iââæ¯ä¸ªææ ä¹å使ç¨åææ ä½¿å®ä»¬æä¸ºæ®éå符ã
è¦å¹é
ææ¬ç¬¦å·åææ ï¼ä½ éè¦è½¬ä¹åææ ãä¾å¦ï¼è¦å¹é
å符串âC:\âï¼å
¶ä¸âCâå¯ä»¥æ¯ä»»ä½åæ¯ï¼ä½ å°ä½¿ç¨/[A-Z]:\\/ââ第ä¸ä¸ªåææ è½¬ä¹åé¢çé£ä¸ªåææ ï¼å æ¤è¡¨è¾¾å¼æç´¢å个æ®éåç¬¦åææ ã
å¦æå° RegExp æé 彿°ä¸å符串æåä¸èµ·ä½¿ç¨ï¼è¯·è®°ä½åææ æ¯å符串æåä¸ç转ä¹ï¼å æ¤è¦å¨æ£å表达å¼ä¸ä½¿ç¨å®ï¼ä½ éè¦å¨å符串æå级å«è½¬ä¹å®ã /a\*b/ ånew RegExp("a\\*b")å建çè¡¨è¾¾å¼æ¯ç¸åçï¼æç´¢âaâåè·æåâ*âåè·âbâã
å°ç¨æ·è¾å ¥è½¬ä¹ä¸ºæ£å表达å¼ä¸çä¸ä¸ªåé¢å符串ï¼å¯ä»¥éè¿ç®åçæ¿æ¢æ¥å®ç°ï¼
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
//$&表示æ´ä¸ªè¢«å¹é
çå符串
}
æ£å表达å¼åç"g"æ¯ä¸ä¸ªè¡¨ç¤ºå ¨å±æç´¢éé¡¹ææ è®°ï¼å°å¨æ´ä¸ªåç¬¦ä¸²æ¥æ¾å¹¶è¿åææå¹é ç»æãè¿å°å¨ä¸é¢çéè¿æ å¿è¿è¡é«çº§æç´¢è¯¦è¿°ã
为ä»ä¹è¿ä¸ªæ²¡æå å»ºå¨ JavaScript ä¸ï¼ä¹åæè®¡åå¨ RegExp å¯¹è±¡ä¸æ·»å ä¸ä¸ª Functionï¼ä½å¨TC39ä¸è¢«å¦å³äºã
ä½¿ç¨æå ¥è¯
任使£å表达å¼çæå ¥è¯é½ä¼ä½¿è¿é¨åå¹é çå¯å符串被记å¿ã䏿¦è¢«è®°å¿ï¼è¿ä¸ªå¯å符串就å¯ä»¥è¢«è°ç¨äºå ¶ä»ç¨éï¼å¦å ä½¿ç¨æ¬å·çåå符串å¹é ä¹ä¸æè¿°ã
æ¯å¦ï¼ /Chapter (\d+)\.\d*/ è§£éäºé¢å¤è½¬ä¹çåç¹æ®çå符ï¼å¹¶è¯´æäºè¿é¨å pattern åºè¯¥è¢«è®°å¿ãå®ç²¾ç¡®å°å¹é
åé¢è·çä¸ä¸ªä»¥ä¸æ°åå符çå符 'Chapter ' (\d æä¸ºä»»ä½æ°åå符ï¼+ æä¸º 1 次以ä¸)ï¼è·çä¸ä¸ªå°æ°ç¹ï¼å¨è¿ä¸ªåç¬¦ä¸æ¬èº«ä¹æ¯ä¸ä¸ªç¹æ®å符ï¼å°æ°ç¹åç \ æå³çè¿ä¸ª pattern å¿
须寻æ¾åé¢å符 '.')ï¼è·ç任使°åå符 0 次以ä¸ã (\d æä¸ºæ°ååç¬¦ï¼ * æä¸º 0 次以ä¸)ãå¦å¤ï¼æå
¥è¯ä¹ç¨æ¥è®°å¿ç¬¬ä¸ä¸ªå¹é
çæ°åå符ã
æ¤æ¨¡å¼å¯ä»¥å¹é å符串"Open Chapter 4.3, paragraph 6"ï¼å¹¶ä¸'4'å°ä¼è¢«è®°ä½ãæ¤æ¨¡å¼å¹¶ä¸è½å¹é "Chapter 3 and 4"ï¼å 为å¨è¿ä¸ªå符串ä¸'3'çå颿²¡æç¹å·'.'ã
æ¬å·ä¸ç"?:"ï¼è¿ç§æ¨¡å¼å¹é çåå符串å°ä¸ä¼è¢«è®°ä½ãæ¯å¦ï¼(?:\d+) å¹é 䏿¬¡æå¤æ¬¡æ°åå符ï¼ä½æ¯ä¸è½è®°ä½å¹é çå符ã
ä½¿ç¨æ£å表达å¼
æ£å表达å¼å¯ä»¥è¢«ç¨äº RegExp ç exec å test æ¹æ³ä»¥å String ç matchãreplaceãsearch å split æ¹æ³ãè¿äºæ¹æ³å¨ JavaScript æåä¸æè¯¦ç»çè§£éã
| æ¹æ³ | æè¿° |
|---|---|
exec |
ä¸ä¸ªå¨åç¬¦ä¸²ä¸æ§è¡æ¥æ¾å¹é ç RegExp æ¹æ³ï¼å®è¿åä¸ä¸ªæ°ç»ï¼æªå¹é å°åè¿å nullï¼ã |
test |
ä¸ä¸ªå¨åç¬¦ä¸²ä¸æµè¯æ¯å¦å¹é ç RegExp æ¹æ³ï¼å®è¿å true æ falseã |
match |
ä¸ä¸ªå¨åç¬¦ä¸²ä¸æ§è¡æ¥æ¾å¹é ç String æ¹æ³ï¼å®è¿åä¸ä¸ªæ°ç»ï¼å¨æªå¹é å°æ¶ä¼è¿å nullã |
matchAll |
ä¸ä¸ªå¨åç¬¦ä¸²ä¸æ§è¡æ¥æ¾ææå¹é ç String æ¹æ³ï¼å®è¿åä¸ä¸ªè¿ä»£å¨ï¼iteratorï¼ã |
search |
ä¸ä¸ªå¨åç¬¦ä¸²ä¸æµè¯å¹é ç String æ¹æ³ï¼å®è¿åå¹é å°çä½ç½®ç´¢å¼ï¼æè å¨å¤±è´¥æ¶è¿å -1ã |
replace |
ä¸ä¸ªå¨åç¬¦ä¸²ä¸æ§è¡æ¥æ¾å¹é ç String æ¹æ³ï¼å¹¶ä¸ä½¿ç¨æ¿æ¢åç¬¦ä¸²æ¿æ¢æå¹é å°çåå符串ã |
split |
ä¸ä¸ªä½¿ç¨æ£åè¡¨è¾¾å¼æè
ä¸ä¸ªåºå®å符串åéä¸ä¸ªå符串ï¼å¹¶å°åéåçåå符串åå¨å°æ°ç»ä¸ç String æ¹æ³ã |
å½ä½ æ³è¦ç¥éå¨ä¸ä¸ªå符串ä¸çä¸ä¸ªå¹é æ¯å¦è¢«æ¾å°ï¼ä½ å¯ä»¥ä½¿ç¨ test æ search æ¹æ³ï¼æ³å¾å°æ´å¤çä¿¡æ¯ï¼ä½æ¯æ¯è¾æ ¢ï¼åå¯ä»¥ä½¿ç¨ exec æ match æ¹æ³ãå¦æä½ ä½¿ç¨ exec æ match æ¹æ³å¹¶ä¸å¹é æåäºï¼é£ä¹è¿äºæ¹æ³å°è¿åä¸ä¸ªæ°ç»å¹¶ä¸æ´æ°ç¸å ³çæ£å表达å¼å¯¹è±¡ç屿§åé¢å®ä¹çæ£å表达å¼å¯¹è±¡ï¼è¯¦è§ä¸ï¼ã妿å¹é 失败ï¼é£ä¹ exec æ¹æ³è¿å nullï¼ä¹å°±æ¯ falseï¼ã
卿¥ä¸æ¥çä¾åä¸ï¼èæ¬å°ä½¿ç¨ exec æ¹æ³å¨ä¸ä¸ªåç¬¦ä¸²ä¸æ¥æ¾ä¸ä¸ªå¹é ã
var myRe = /d(b+)d/g;
var myArray = myRe.exec("cdbbdbsbz");
å¦æä½ ä¸éè¦è®¿é®æ£å表达å¼ç屿§ï¼è¿ä¸ªèæ¬éè¿å¦ä¸ä¸ªæ¹æ³æ¥å建 myArrayï¼
var myArray = /d(b+)d/g.exec("cdbbdbsbz");
// å "cdbbdbsbz".match(/d(b+)d/g); ç¸ä¼¼ã
// 使¯ "cdbbdbsbz".match(/d(b+)d/g) è¾åºæ°ç» [ "dbbd" ]ï¼
// è /d(b+)d/g.exec('cdbbdbsbz') è¾åºæ°ç» [ "dbbd", "bb", index: 1, input: "cdbbdbsbz" ].
å¦æä½ æ³éè¿ä¸ä¸ªå符串æå»ºæ£å表达å¼ï¼é£ä¹è¿ä¸ªèæ¬è¿æå¦ä¸ç§æ¹æ³ï¼
var myRe = new RegExp("d(b+)d", "g");
var myArray = myRe.exec("cdbbdbsbz");
éè¿è¿äºèæ¬ï¼å¹é æååå°è¿åä¸ä¸ªæ°ç»å¹¶ä¸æ´æ°æ£å表达å¼ç屿§ï¼å¦ä¸è¡¨æç¤ºã
| 对象 | 屿§æç´¢å¼ | æè¿° | å¨ä¾åä¸å¯¹åºçå¼ |
|---|---|---|---|
myArray |
å¹é å°çåç¬¦ä¸²åææè¢«è®°ä½çåå符串ã | ["dbbd", "bb"] |
|
index |
å¨è¾å ¥çå符串ä¸å¹é å°ç以 0 å¼å§çç´¢å¼å¼ã | 1 |
|
input |
åå§å符串ã | "cdbbdbsbz" |
|
[0] |
æè¿ä¸ä¸ªå¹é å°çå符串ã | "dbbd" |
|
myRe |
lastIndex |
å¼å§ä¸ä¸ä¸ªå¹é çèµ·å§ç´¢å¼å¼ãï¼è¿ä¸ªå±æ§åªæå¨ä½¿ç¨ g åæ°æ¶å¯ç¨å¨ éè¿åæ°è¿è¡é«çº§æç´¢ ä¸èæè¯¦ç»çæè¿°.) | 5 |
source |
模å¼å颿æ¬ã卿£å表达å¼åå»ºæ¶æ´æ°ï¼ä¸æ§è¡ã | "d(b+)d" |
å¦è¿ä¸ªä¾åä¸ç第äºç§å½¢å¼æç¤ºï¼ä½ å¯ä»¥ä½¿ç¨å¯¹è±¡åå§å¨å建ä¸ä¸ªæ£å表达å¼å®ä¾ï¼ä½ä¸åé ç»åéãå¦æä½ è¿æ ·åï¼é£ä¹ï¼æ¯ä¸æ¬¡ä½¿ç¨æ¶é½ä¼å建ä¸ä¸ªæ°çæ£å表达å¼å®ä¾ãå æ¤ï¼å¦æä½ 䏿æ£å表达å¼å®ä¾åé ç»ä¸ä¸ªåéï¼ä½ 以åå°ä¸è½è®¿é®è¿ä¸ªæ£å表达å¼å®ä¾ç屿§ãä¾å¦ï¼åå¦ä½ æå¦ä¸èæ¬ï¼
var myRe = /d(b+)d/g;
var myArray = myRe.exec("cdbbdbsbz");
console.log("The value of lastIndex is " + myRe.lastIndex);
è¿ä¸ªèæ¬è¾åºå¦ä¸ï¼
The value of lastIndex is 5
ç¶èï¼å¦æä½ æå¦ä¸èæ¬ï¼
var myArray = /d(b+)d/g.exec("cdbbdbsbz");
console.log("The value of lastIndex is " + /d(b+)d/g.lastIndex);
宿¾ç¤ºä¸ºï¼
The value of lastIndex is 0
å½åç/d(b+)d/g 使ç¨ä¸¤ä¸ªä¸åç¶æçæ£å表达å¼å¯¹è±¡ï¼lastIndex 屿§ä¼å¾å°ä¸åçå¼ãå¦æä½ éè¦è®¿é®ä¸ä¸ªæ£å表达å¼ç屿§ï¼åéè¦å建ä¸ä¸ªå¯¹è±¡åå§åçæå¨ï¼ä½ åºè¯¥é¦å æå®èµå¼ç»ä¸ä¸ªåéã
ä½¿ç¨æ¬å·çåå符串å¹é
ä¸ä¸ªæ£åè¡¨è¾¾å¼æ¨¡å¼ä½¿ç¨æ¬å·ï¼å°å¯¼è´ç¸åºçåå¹é 被记ä½ãä¾å¦ï¼/a(b)c /å¯ä»¥å¹é å符串âabcâï¼å¹¶ä¸è®°å¾âbâãåè°è¿äºæ¬å·ä¸å¹é çå串ï¼ä½¿ç¨æ°ç»å ç´ [1],â¦â¦[n]ã
ä½¿ç¨æ¬å·å¹é çååç¬¦ä¸²çæ°éæ¯æ éçãè¿åçæ°ç»ä¸ä¿åææè¢«åç°çåå¹é ãä¸é¢çä¾å说æäºå¦ä½ä½¿ç¨æ¬å·çåå符串å¹é ã
ä¸é¢çèæ¬ä½¿ç¨ replace() æ¹æ³æ¥è½¬æ¢å符串ä¸çåè¯ãå¨å¹é å°çæ¿æ¢ææ¬ä¸ï¼èæ¬ä½¿ç¨æ¿ä»£ç$ 1,$ 2 表示第ä¸ä¸ªå第äºä¸ªæ¬å·çåå符串å¹é ã
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
console.log(newstr);
è¿ä¸ªè¡¨è¾¾å¼è¾åº "Smith, John"ã
éè¿æ å¿è¿è¡é«çº§æç´¢
æ£åè¡¨è¾¾å¼æå
个å¯éåæ° (flags) å
许å
¨å±åä¸å大å°åæç´¢çãè¿äºåæ°æ¢å¯ä»¥åç¬ä½¿ç¨ä¹è½ä»¥ä»»æé¡ºåºä¸èµ·ä½¿ç¨ï¼å¹¶ä¸è¢«å
å«å¨æ£å表达å¼å®ä¾ä¸ã
| æ å¿ | æè¿° |
|---|---|
g |
å ¨å±æç´¢ã |
i |
ä¸åºå大å°åæç´¢ã |
m |
å¤è¡æç´¢ã |
s |
å
许 . å¹é
æ¢è¡ç¬¦ã |
u |
ä½¿ç¨ unicode ç çæ¨¡å¼è¿è¡å¹é ã |
y |
æ§è¡âç²æ§ (sticky)âæç´¢ï¼å¹é
ä»ç®æ å符串çå½åä½ç½®å¼å§ã |
为äºå¨æ£å表达å¼ä¸å 嫿 å¿ï¼è¯·ä½¿ç¨ä»¥ä¸è¯æ³ï¼
var re = /pattern/flags;
æè
var re = new RegExp("pattern", "flags");
å¼å¾æ³¨æçæ¯ï¼æ å¿æ¯ä¸ä¸ªæ£å表达å¼çä¸é¨åï¼å®ä»¬å¨æ¥ä¸æ¥çæ¶é´å°ä¸è½æ·»å æå é¤ã
ä¾å¦ï¼re = /\w+\s/g å°å建ä¸ä¸ªæ¥æ¾ä¸ä¸ªæå¤ä¸ªå符åæä¸ä¸ªç©ºæ ¼çæ£å表达å¼ï¼æè ç»åèµ·æ¥åæ¤è¦æ±çå符串ã
var re = /\w+\s/g;
var str = "fee fi fo fum";
var myArray = str.match(re);
console.log(myArray);
// ["fee ", "fi ", "fo "]
è¿æ®µä»£ç å°è¾åº ["fee ", "fi ", "fo "]ãå¨è¿ä¸ªä¾åä¸ï¼ä½ å¯ä»¥å°ï¼
var re = /\w+\s/g;
æ¿æ¢æï¼
var re = new RegExp("\\w+\\s", "g");
å¹¶ä¸è½è·åå°ç¸åçç»æã
ä½¿ç¨ .exec() æ¹æ³æ¶ï¼ä¸ g æ å¿å
³èçè¡ä¸ºæ¯ä¸åçãï¼âclassâåâargumentâçä½ç¨ç¸åï¼å¨ .match() çæ
åµä¸ï¼åç¬¦ä¸²ç±»ï¼ææ°æ®ç±»åï¼æ¥æè¯¥æ¹æ³ï¼èæ£å表达å¼åªæ¯ä¸ä¸ªåæ°ï¼èå¨ .exec() çæ
åµä¸ï¼å®æ¯æ¥æè¯¥æ¹æ³çæ£å表达å¼ï¼å
¶ä¸å符串æ¯åæ°ãï¼å¯¹æ¯ str.match(re) ä¸ re.exec(str)ï¼g æ å¿ä¸ .exec() æ¹æ³ä¸èµ·ä½¿ç¨è·å¾è¿ä»£è¿å±ã
var xArray;
while ((xArray = re.exec(str))) console.log(xArray);
// produces:
// ["fee ", index: 0, input: "fee fi fo fum"]
// ["fi ", index: 4, input: "fee fi fo fum"]
// ["fo ", index: 7, input: "fee fi fo fum"]
m æ å¿ç¨äºæå®å¤è¡è¾å ¥å符串åºè¯¥è¢«è§ä¸ºå¤ä¸ªè¡ãå¦æä½¿ç¨ m æ å¿ï¼^å$å¹é çå¼å§æç»æè¾å ¥å符串ä¸çæ¯ä¸è¡ï¼è䏿¯æ´ä¸ªå符串çå¼å§æç»æã
示ä¾
以ä¸ä¾å说æäºä¸äºæ£å表达å¼çç¨éã
æ¹åè¾å ¥å符串ç顺åº
以ä¸ä¾åè§£éäºæ£å表达å¼çææå string.split() 以å string.replace()çç¨éãå®ä¼æ´çä¸ä¸ªåªæç²ç¥æ ¼å¼ç嫿å
¨åï¼ååé¦å
åºç°ï¼çè¾å
¥å符串ï¼è¿ä¸ªåç¬¦ä¸²è¢«ç©ºæ ¼ãæ¢è¡ç¬¦åä¸ä¸ªåå·åéãæç»ï¼å®ä¼é¢ ååå顺åºï¼å§æ°é¦å
åºç°ï¼å list çç±»åã
// ä¸é¢è¿ä¸ªå§åå符串å
å«äºå¤ä¸ªç©ºæ ¼åå¶è¡¨ç¬¦ï¼
// ä¸å¨å§ååä¹é´å¯è½æå¤ä¸ªç©ºæ ¼åå¶è¡¨ç¬¦ã
var names = "Orange Trump ;Fred Barney; Helen Rigby ; Bill Abel ; Chris Hand ";
var output = ["---------- Original String\n", names + "\n"];
// åå¤ä¸¤ä¸ªæ¨¡å¼çæ£åè¡¨è¾¾å¼æ¾è¿æ°ç»éã
// åå²è¯¥å符串æ¾è¿æ°ç»éã
// å¹é
模å¼ï¼å¹é
ä¸ä¸ªåå·åç´§æ¥å
¶ååææå¯è½åºç°çè¿ç»çä¸å¯è§ç¬¦å·ã
var pattern = /\s*;\s*/;
// æéè¿ä¸è¿°å¹é
模å¼åå²çå符串æ¾è¿ä¸ä¸ªå«å nameList çæ°ç»éé¢ã
var nameList = names.split(pattern);
// æ°å»ºä¸ä¸ªå¹é
模å¼ï¼å¹é
ä¸ä¸ªæå¤ä¸ªè¿ç»çä¸å¯è§å符åå
¶ååç´§æ¥çç±
// ä¸ä¸ªæå¤ä¸ªè¿ç»çåºæ¬æä¸åæ¯è¡¨ä¸çåæ¯ãæ°ååä¸åçº¿ç»æçå符串
// ç¨ä¸å¯¹åæ¬å·æ¥æè·è¯¥æ¨¡å¼ä¸çä¸é¨åå¹é
ç»æã
// æè·çç»æç¨åä¼ç¨å°ã
pattern = /(\w+)\s+(\w+)/;
// æ°å»ºä¸ä¸ªæ°ç» bySurnameList ç¨æ¥ä¸´æ¶åæ¾æ£å¨å¤ççååã
var bySurnameList = [];
// è¾åº nameList çå
ç´ å¹¶ä¸æ nameList éçåå
// ç¨éå·æ¥ç©ºæ ¼çæ¨¡å¼æå§åååå²å¼æ¥ç¶ååæ¾è¿æ°ç» bySurnameList ä¸ã
//
// ä¸é¢çè¿ä¸ªæ¿æ¢æ¹æ³æ nameList éçå
ç´ ç¨ $2, $1 çæ¨¡å¼
//ï¼ç¬¬äºä¸ªæè·çå¹é
ç»æç´§æ¥çä¸ä¸ªéå·ä¸ä¸ªç©ºæ ¼ç¶åç´§æ¥ç第ä¸ä¸ªæè·çå¹é
ç»æï¼æ¿æ¢äº
// åé $1 ååé $2 æ¯ä¸é¢ææè·çå¹é
ç»æã
output.push("---------- After Split by Regular Expression");
var i, len;
for (i = 0, len = nameList.length; i < len; i++) {
output.push(nameList[i]);
bySurnameList[i] = nameList[i].replace(pattern, "$2, $1");
}
// è¾åºæ°çæ°ç»
output.push("---------- Names Reversed");
for (i = 0, len = bySurnameList.length; i < len; i++) {
output.push(bySurnameList[i]);
}
// æ ¹æ®å§æ¥æåºï¼ç¶åè¾åºæåºåçæ°ç»ã
bySurnameList.sort();
output.push("---------- Sorted");
for (i = 0, len = bySurnameList.length; i < len; i++) {
output.push(bySurnameList[i]);
}
output.push("---------- End");
console.log(output.join("\n"));
ç¨ç¹æ®å符æ£éªè¾å ¥
å¨ä»¥ä¸ä¾åä¸ï¼æä»¬ææç¨æ·è¾å ¥ä¸ä¸ªçµè¯å·ç ãå½ç¨æ·ç¹å»âCheckâæé®ï¼æä»¬çèæ¬å¼å§æ£æ¥è¿äºæ°åæ¯å¦åæ³ã妿æ°ååæ³ï¼å¹é æ£åè¡¨è¾¾å¼æè§å®çå符åºåï¼ï¼èæ¬æ¾ç¤ºä¸æ¡æè°¢ç¨æ·çä¿¡æ¯å¹¶ç¡®è®¤è¯¥æ°åã妿è¿ä¸²æ°åä¸åæ³ï¼èæ¬æç¤ºç¨æ·çµè¯å·ç ä¸åæ³ã
å
å«éæè·æ¬å· (?: è¿ä¸ªæ£å表达å¼å¯»æ¾ä¸ä¸ªæ°åå符 \d{3} æè
| ä¸ä¸ªå·¦åæ¬å· \( è·çä¸ä½æ°å \d{3}, è·çä¸ä¸ªå°éæ¬å· \), (ç»æéæè·æ¬å· ))ï¼åè·çä¸ä¸ªçç ´æå·ææ£ææ æå°æ°ç¹ï¼éåè·éä¸ä¸ªæ°åå符ï¼å½è®°å¿å符 ([-\/\.]) æè·å¹¶è®°ä½ï¼åé¢è·çä¸ä½å°æ° \d{3}ï¼ååé¢è·éè®°ä½çç ´æå·ãæ£ææ æå°æ°ç¹ \1ï¼æåè·çåä½å°æ° \d{4}ã
å½ç¨æ·æä¸ Enter 设置 RegExp.inputï¼è¿äºååä¹è½è¢«æ¿æ´»ã
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<script type="text/javascript">
var re = /(?:\d{3}|\(\d{3}\))([-\/\.])\d{3}\1\d{4}/;
function testInfo(phoneInput) {
var OK = re.exec(phoneInput.value);
if (!OK)
window.alert(
phoneInput.value + " isn't a phone number with area code!",
);
else window.alert("Thanks, your phone number is " + OK[0]);
}
</script>
</head>
<body>
<p>
Enter your phone number (with area code) and then click "Check". <br />The
expected format is like ###-###-####.
</p>
<form action="#">
<input id="phone" /><button
onclick="testInfo(document.getElementById('phone'));">
Check
</button>
</form>
</body>
</html>