RegExp
åºçº¿
广æ³å¯ç¨
*
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
RegExp 对象ç¨äºå°ææ¬ä¸ä¸ä¸ªæ¨¡å¼å¹é
ã
æå ³æ£å表达å¼çä»ç»ï¼è¯·é 读 JavaScript æåä¸çæ£å表达å¼ç« èã
æè¿°
>åé¢éåæé 彿°
æä¸¤ç§æ¹æ³å¯ä»¥å建ä¸ä¸ª RegExp 对象ï¼ä¸ç§æ¯åé¢éï¼å¦ä¸ç§æ¯æé 彿°ã
- åé¢é
-
ç±ææ (/) å å´è䏿¯å¼å·å å´ã
- æé 彿°çåç¬¦ä¸²åæ°
-
ç±å¼å·è䏿¯ææ å å´ã
以ä¸ä¸ç§è¡¨è¾¾å¼é½ä¼å建ç¸åçæ£å表达å¼ï¼
/ab+c/i; //åé¢éå½¢å¼
new RegExp("ab+c", "i"); // é¦ä¸ªåæ°ä¸ºå符串模å¼çæé 彿°
new RegExp(/ab+c/, "i"); // é¦ä¸ªåæ°ä¸ºå¸¸è§åé¢éçæé 彿°
å½è¡¨è¾¾å¼è¢«èµå¼æ¶ï¼åé¢é形弿便£å表达å¼çç¼è¯ï¼compilationï¼ç¶æï¼å½æ£å表达å¼ä¿æä¸ºå¸¸éæ¶ä½¿ç¨åé¢éãä¾å¦å½ä½ å¨å¾ªç¯ä¸ä½¿ç¨åé¢éæé ä¸ä¸ªæ£åè¡¨è¾¾å¼æ¶ï¼æ£å表达å¼ä¸ä¼å¨æ¯ä¸æ¬¡è¿ä»£ä¸é½è¢«éæ°ç¼è¯ï¼recompiledï¼ã
èæ£å表达å¼å¯¹è±¡çæé 彿°ï¼å¦ new RegExp('ab+c') æä¾äºæ£å表达å¼è¿è¡æ¶ç¼è¯ï¼runtime compilationï¼ãå¦æä½ ç¥éæ£åè¡¨è¾¾å¼æ¨¡å¼å°ä¼æ¹åï¼æè
ä½ äºå
ä¸ç¥éä»ä¹æ¨¡å¼ï¼èæ¯ä»å¦ä¸ä¸ªæ¥æºè·åï¼å¦ç¨æ·è¾å
¥ï¼è¿äºæ
åµé½å¯ä»¥ä½¿ç¨æé 彿°ã
æé 彿°ä¸çæ å¿åæ° (flags)
ä» ECMAScript 6 å¼å§ï¼å½ç¬¬ä¸ä¸ªåæ°ä¸ºæ£å表达å¼è第äºä¸ªæ å¿åæ°å卿¶ï¼new RegExp(/ab+c/, 'i') ä¸åæåº TypeErrorï¼"ä»å¦ä¸ä¸ª RegExp æé ä¸ä¸ª RegExp æ¶æ æ³æä¾æ å¿"ï¼çå¼å¸¸ï¼åè代ä¹ï¼å°ä½¿ç¨è¿äºåæ°å建ä¸ä¸ªæ°çæ£å表达å¼ã
å½ä½¿ç¨æé 彿°åé æ£å对象æ¶ï¼éè¦å¸¸è§çå符转ä¹è§åï¼å¨åé¢å åææ \ï¼ã
æ¯å¦ï¼ä»¥ä¸æ¯çä»·çï¼
var re = new RegExp("\\w+");
var re = /\w+/;
Perl-like RegExp 屿§
请注æï¼RegExp屿§æé¿åç§°åçåç§°ï¼ç±»ä¼¼ Perlï¼ã两个åç§°æ»æ¯å¼ç¨åä¸ä¸ªå¼ãï¼Perl æ¯ JavaScript 为å
¶æ£å表达å¼å»ºæ¨¡çç¼ç¨è¯è¨ï¼ãå¦è¯·åè§ä¸æ¨è使ç¨ç RegExp 屿§ã
æé 彿°
RegExp()-
å建ä¸ä¸ªæ°ç
RegExp对象ã
éæå±æ§
RegExp[Symbol.species]-
该æé 彿°ç¨äºå建派ç对象ã
RegExp.lastIndex-
该索å¼è¡¨ç¤ºä»åªéå¼å§ä¸ä¸ä¸ªå¹é
å®ä¾å±æ§
RegExp.prototype.flags-
嫿
RegExp对象 flags çå符串ã RegExp.prototype.dotAll-
.æ¯å¦è¦å¹é æ°è¡ï¼newlinesï¼ã RegExp.prototype.global-
é对åç¬¦ä¸²ä¸ææå¯è½çå¹é 项æµè¯æ£å表达å¼ï¼è¿æ¯ä» é对第ä¸ä¸ªå¹é 项ã
RegExp.prototype.ignoreCase-
å¹é ææ¬çæ¶åæ¯å¦å¿½ç¥å¤§å°åã
RegExp.prototype.multiline-
æ¯å¦è¿è¡å¤è¡æç´¢ã
RegExp.prototype.source-
æ£å表达å¼çææ¬ã
RegExp.prototype.sticky-
æç´¢æ¯å¦æ¯ stickyã
RegExp.prototype.unicode-
Unicode åè½æ¯å¦å¼å¯ã
å®ä¾æ¹æ³
RegExp.prototype.compile()-
è¿è¡èæ¬çæé´ï¼éæ°ï¼ç¼è¯æ£å表达å¼ã
RegExp.prototype.exec()-
å¨è¯¥åç¬¦ä¸²ä¸æ§è¡å¹é 项çæç´¢ã
RegExp.prototype.test()-
该æ£åå¨åç¬¦ä¸²éæ¯å¦æå¹é ã
RegExp.prototype[Symbol.match]()-
对ç»å®å符串æ§è¡å¹é å¹¶è¿åå¹é ç»æã
RegExp.prototype[Symbol.matchAll]()-
对ç»å®å符串æ§è¡å¹é ï¼è¿åææå¹é ç»æã
RegExp.prototype[Symbol.replace]()-
ç»å®æ°çåä¸²ï¼æ¿æ¢ææå¹é ç»æã
RegExp.prototype[Symbol.search]()-
å¨ç»å®åç¬¦ä¸²ä¸æç´¢å¹é 项ï¼å¹¶è¿åå¨åç¬¦ä¸²ä¸æ¾å°å符索å¼ã
RegExp.prototype[Symbol.split]()-
éè¿å°ç»å®å符串æå为åå符串ï¼å¹¶è¿åå符串形æçæ°ç»ã
RegExp.prototype.toString()-
è¿å表示æå®å¯¹è±¡çå符串ãéå
Object.prototype.toString()æ¹æ³ã
示ä¾
>ä½¿ç¨æ£åæ¹åæ°æ®ç»æ
ä¸ä¾ä½¿ç¨ String ç replace() æ¹æ³å»å¹é
å§å first last è¾åºæ°çæ ¼å¼ last, firstã
卿¿æ¢çææ¬ä¸ï¼èæ¬ä¸ä½¿ç¨ $1 å $2 æææ¬å·éå
åçå¹é
ã
let re = /(\w+)\s(\w+)/;
let str = "John Smith";
let newstr = str.replace(re, "$2, $1");
console.log(newstr);
è¿å°æ¾ç¤º "Smith, John".
ä½¿ç¨æ£åæ¥åå带æå¤ç§è¡ç»æç¬¦åæ¢è¡ç¬¦çææ¬
对äºä¸åçå¹³å°ï¼Unixï¼Windows ççï¼ï¼å ¶é»è®¤çè¡ç»æç¬¦æ¯ä¸ä¸æ ·çãèä¸é¢çååæ¹å¼éç¨äºææå¹³å°ã
let text = 'Some text\nAnd some more\r\nAnd yet\rThis is the end' let lines = text.split(/\r\n|\r|\n/) console.log(lines) // logs [ 'Some text', 'And some more', 'And yet', 'This is the end' ]
注æï¼å¨æ£å表达å¼ä¸ï¼ä»¥ç«çº¿åå²ç忍¡å¼ç顺åºä¼å½±åå¹é ç»æã
å¨å¤è¡ææ¬ä¸ä½¿ç¨æ£å表达å¼
let s = "Please yes\nmake my day!";
s.match(/yes.*day/);
// Returns null
s.match(/yes[^]*day/);
// Returns 'yes\nmake my day'
使ç¨å¸¦æ sticky æ å¿çæ£å表达å¼
带æstickyæ å¿çæ£å表达å¼å°ä¼ä»æºå符串çRegExp.prototype.lastIndexä½ç½®å¼å§å¹é
ï¼ä¹å°±æ¯è¿è¡âç²æ§å¹é
âã
let str = "#foo#";
let regex = /foo/y;
regex.lastIndex = 1;
regex.test(str); // true
regex.lastIndex = 5;
regex.test(str); // false (lastIndex is taken into account with sticky flag)
regex.lastIndex; // 0 (reset after match failure)
sticky æ å¿å global æ å¿çä¸åç¹
妿æ£åè¡¨è¾¾å¼æç²æ§ y æ å¿ï¼ä¸ä¸æ¬¡å¹é
ä¸å®å¨ lastIndex ä½ç½®å¼å§ï¼å¦ææ£åè¡¨è¾¾å¼æå
¨å± g æ å¿ï¼ä¸ä¸æ¬¡å¹é
å¯è½å¨ lastIndex ä½ç½®å¼å§ï¼ä¹å¯è½å¨è¿ä¸ªä½ç½®çåé¢å¼å§ã
re = /\d/y;
while ((r = re.exec("123 456")))
console.log(r, "AND re.lastIndex", re.lastIndex);
// [ '1', index: 0, input: '123 456', groups: undefined ] AND re.lastIndex 1
// [ '2', index: 1, input: '123 456', groups: undefined ] AND re.lastIndex 2
// [ '3', index: 2, input: '123 456', groups: undefined ] AND re.lastIndex 3
// ... and no more match.
å¦æä½¿ç¨å¸¦æå
¨å±æ å¿gçæ£å表达å¼reï¼å°±ä¼æè·å符串ä¸çææ 6 个æ°åï¼èé 3 个
ä½¿ç¨æ£å表达å¼å Unicode å符
æ£å¦ä¸é¢è¡¨æ ¼æå°çï¼\w æ \W åªä¼å¹é
åºæ¬ç ASCII å符ï¼å¦ a å° zã A å° Zã 0 å° 9 å _ã
为äºå¹é
å
¶ä»è¯è¨ä¸çå符ï¼å¦è¥¿éå°ï¼Cyrillicï¼æ å¸ä¼¯æ¥è¯ï¼Hebrewï¼ï¼è¦ä½¿ç¨ \uhhhhï¼hhhh 表示以åå
è¿å¶è¡¨ç¤ºçå符ç Unicode å¼ã
ä¸ä¾å±ç¤ºäºææ ·ä»ä¸ä¸ªåè¯ä¸åç¦»åº Unicode å符ã
let text = "ÐбÑÐ°Ð·ÐµÑ text на ÑÑÑÑком ÑзÑке";
let regex = /[\u0400-\u04FF]+/g;
let match = regex.exec(text);
console.log(match[0]); // prints "ÐбÑазеÑ"
console.log(regex.lastIndex); // prints "7"
let match2 = regex.exec(text);
console.log(match2[0]); // prints "на" [did not print "text"]
console.log(regex.lastIndex); // prints "15"
// and so on
Unicode 屿§è½¬ä¹ç¹æ§å¼å ¥äºä¸ç§è§£å³æ¹æ¡ï¼å®å 许使ç¨å\p{scx=Cyrl}è¿æ ·ç®åçè¯å¥ãè¿éæä¸ä¸ªå¤é¨èµæºï¼ç¨æ¥è·å Unicode ä¸çä¸ååºåèå´ï¼Regexp-unicode-block
ä» URL 䏿åååå
var url = "http://xxx.domain.com";
console.log(/[^.]+/.exec(url)[0].substr(7)); // logs "xxx"
夿³¨ï¼ä½¿ç¨æµè§å¨å 建çURL APIè鿣åè¡¨è¾¾å¼æ¥è§£æ URL æ¯æ´å¥½çåæ³
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-regexp-regular-expression-objects> |