javascript
DOM笔记(十):JavaScript正则表达式
2019獨角獸企業重金招聘Python工程師標準>>>
一、RegExp
ECMAScript通過RegExp類型類支持正則表達式,語法和Perl類似:
var exp = /pattern/flags;
patternb部分是任何簡單的或復雜的正則表達式;flags是每個正則表達式所帶的一個或者多個標志。
正則表達式的模式匹配支持三個標志:
g:全局模式,即模式應用于整個字符串,而非在發現第一個匹配項時立即停止
i:不區分大小寫模式
m:多行模式,即到達一行文本末尾是還會繼續茶查找下一行中是否存在與模式匹配的項。
1、創建正則表達式
JavaScript創建正則表示有兩種方式:字面量創建和RegExp對象創建。
//字面量創建var?pattern1?=?/[bc]at/i;var?pattern2?=?/\[bc\]at/ig;//RegExp對象創建var?pattern3?=?new?RegExp("[bc]at","i");??//與pattern1等效var?pattern4?=?new?RegExp("\\[bc\\]at","ig");??//與pattern2等效?
二者的區別有兩個方面:對特殊字符的轉換方式和實例創建。
RegExp構造函數的模式參數是字符串,所以需要對特殊字符進行雙重轉義,區別如下:
/\w\\hello/
| 字面量模式 | 等價的字符串 |
| /\[bc\]at/ | “\\[bc\\]at” |
| /\d.\d{1,2}/ | “\\d.\\d{1,2}” |
| /\w\\hello/ | “\\w\\\\hello” |
在ECMAScript 3中,字面量形式共享一個RegExp實例,而構造函數的每個實例都不同
var?re?=?null,i;for(i=0;i<3;i++) {re?=?/cat/g;re.test("catastrophe"); }for(i=0;i<3;i++) {re?=?new?RegExp("cat","g");re.test("catastrophe"); }?
在低版本瀏覽器中,如IE6,對于第一個循環只彈出一次true,其余是false。第二個循環都彈出true。
在ECMAScript 5中規定:使用正則表達式字面量跟使用RegExp構造函數一樣,每次調用都創建新的實例。所以兩個循環在現代瀏覽器中都彈出true。
2、RegExp實例屬性
| 屬性 | 說明 |
| global | 布爾值,是否設置了g標志 |
| ignoreCase | 布爾值,是否設置了i標志 |
| multiline | 布爾值,是否設置了m標志 |
| lastIndex | 整數,下一次匹配開始的字符位置 |
| source | 正則表達式的字符串表示 |
? 3、方法
常用的方法有兩個:exec()和test(),均接受一個字符串參數。
若存在匹配項,exec()返回一個數組,數組有兩個額外的屬性:index和input。index表示匹配項在字符串中的位置,input表示源字符串,即exec()的參數。在數組中,第一項是與整個模式匹配的字符串,其他項則與捕獲組匹配(若沒有捕獲組,則只包含一項)。不存在匹配項,exec()返回null。
test()表示字符串中是否存在匹配項,存在返回true,不存在返回false。
var?text?=?"mom?and?dad?and?bady";var?pattern?=?/mom(?and?dad(?and?bady)?)?/gi;var?matches?=?pattern.exec(text); alert(matches.length);????//3alert(matches.index);?????//0alert(matches.input);?????//mom?and?dad?and?badyalert(matches[0]);????????//mom?and?dad?and?badyalert(matches[1]);????????//and?dad?and?badyalert(matches[2]);????????//and?bady?
對于exec()而言,若不設置全局標志g,在同一個字符串上多次調用exec()始終返回第一個匹配項的信息;若設置了全局標志g,每次調用exec()則從上次匹配的位置處繼續查找字符串。
二、String類型
String類型是字符串的對象包裝類型,與Number、Boolean等一樣(DOM筆記(九):引用類型、基本包裝類型和單體內置對象 ),也可以用new來創建字符串。模式匹配在字符串處理中是很有用的,String類型也定義了多個與其相關的方法。
match(pattern):pattern是一個字面量正則表達式或RegExp對象,本質上和exec()方法一樣。
var?text?=?"cat,bat,sat,fat";var?pattern?=?/.at/;var?matches?=?text.match(pattern);//var?matches?=?pattern.exec(text);alert(matches.index); alert(matches[0]); alert(pattern.lastIndex);?
search(pattern):參數和match()相同,從開頭開始查找,返回第一個匹配項的索引,若沒有匹配項,返回-1
var?text?=?"cat,bat,sat,fat";var?pos?=?text.search(/at/); alert(pos);???//1?
replace(oldstring,newstring):用newstring替換oldstring。第一個字符串可以是一個模式對象,第二個字符串可以結合捕獲組使用,或者是一個函數。
var?text?=?"cat,bat,sat,fat";var?pattern?=?/(.at)/g;var?re?=?text.replace(pattern,"word($1)"); alert(re);??//word(cat),word(bat),word(sat),word(fat)如果模式中沒有捕獲組,則用空字符串代替。
? 若第二個參數是函數,則該函數接收三個參數:模式匹配項、模式匹配項在字符串中的位置和原始字符串。
function?htmlEscape(text) {????return?text.replace(/[<>"&]/g,function(match,pos,text){switch(match){case?"<":return?"<";case?">":return?">";case?"&":return?"&";case?"\"":????????????????????return?""";}}); }//返回:<p?class="greeting">helloWorld</p>alert(htmlEscape("<p?class=\"greeting\">helloWorld</p>"));?
若正則表達式中定義了多個捕獲組,則傳遞給函數的依次是匹配項、第一個捕獲組、第二個捕獲組。。。。最后兩個參數不變。
split(string[,limit]):分隔字符串,返回一個數組。string可以是一個普通的字符串,也可以是一個模式匹配對象。可選的limit表示返回數組的大小
var?colorText?=?"red,blue,yellow,black";?? alert(colorText.split(","));???//[red,blue,yellow,black]alert(colorText.split(",",2));??//[red,blue]alert(colorText.split(/\W/));??//[red,blue,yellow,black]?
三、正則表達式的規則
字符 | 說明 |
\ | 將下一個字符標記為一個特殊字符、或一個原義字符、或一個向后引用、或一個八進制轉義符。例如,“n”匹配字符“n”。“\n”匹配一個換行符。序列“\\”匹配“\”而“\(”則匹配“(”。 |
^ | 匹配輸入字符串的開始位置。如果設置了RegExp對象的Multiline屬性,^也匹配“\n”或“\r”之后的位置。 |
$ | 匹配輸入字符串的結束位置。如果設置了RegExp對象的Multiline屬性,$也匹配“\n”或“\r”之前的位置。 |
* | 匹配前面的子表達式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等價于{0,}。 |
+ | 匹配前面的子表達式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價于{1,}。 |
? | 匹配前面的子表達式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等價于{0,1}。 |
{n} | n是一個非負整數。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個o。 |
{n,} | n是一個非負整數。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價于“o+”。“o{0,}”則等價于“o*”。 |
{n,m} | m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個o。“o{0,1}”等價于“o?”。請注意在逗號和兩個數之間不能有空格。 |
? | 當 該字符緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而 默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對于字符串“oooo”,“o+?”將匹配單個“o”,而“o+”將匹配所有“o”。 |
. | 匹配除“\n”之外的任何單個字符。要匹配包括“\n”在內的任何字符,請使用像“[.\n]”的模式。 |
(pattern) | 匹配pattern并獲取這一匹配。所獲取的匹配可以從產生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號字符,請使用“\(”或“\)”。 |
(?:pattern) | 匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以后使用。這在使用或字符“(|)”來組合一個模式的各個部分是很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達式。 |
(?=pattern) | 正 向預查,在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例 如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配 “Windows3.1”中的“Windows”。預查不消耗字符,也就是說,在一個匹配發生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從 包含預查的字符之后開始。 |
(?!pattern) | 負 向預查,在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如 “Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中 的“Windows”。預查不消耗字符,也就是說,在一個匹配發生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始 |
x|y | 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”則匹配“zood”或“food”。 |
[xyz] | 字符集合。匹配所包含的任意一個字符。例如,“[abc]”可以匹配“plain”中的“a”。 |
[^xyz] | 負值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“p”。 |
[a-z] | 字符范圍。匹配指定范圍內的任意字符。例如,“[a-z]”可以匹配“a”到“z”范圍內的任意小寫字母字符。 |
[^a-z] | 負值字符范圍。匹配任何不在指定范圍內的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范圍內的任意字符。 |
\b | 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。 |
\B | 匹配非單詞邊界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。 |
\d | 匹配一個數字字符。等價于[0-9]。 |
\D | 匹配一個非數字字符。等價于[^0-9]。 |
\s | 匹配任何空白字符,包括空格、制表符、換頁符等等。等價于[\f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等價于[^\f\n\r\t\v]。 |
\w | 匹配包括下劃線的任何單詞字符。等價于“[A-Za-z0-9_]” |
\W | 匹配任何非單詞字符。等價于“[^A-Za-z0-9_]”。 |
\f、\n、\r、\t、\v | 匹配一個換頁符、換行符、回車符、水平制表符、垂直制表符,分別等價于\x0c和\cL、\x0a和\cJ、\x0d和\cM、\x09和\cI、\x0b和\cK |
\cx | 匹配由x指明的控制字符。例如,\cM匹配一個Control-M或回車符。x的值必須為A-Z或a-z之一。否則,將c視為一個原義的“c”字符。 |
\xn | 匹配n,其中n為十六進制轉義值。十六進制轉義值必須為確定的兩個數字長。例如,“\x41”匹配“A”。“\x041”則等價于“\x04&1”。正則表達式中可以使用ASCII編碼。 |
\num | 匹配num,其中num是一個正整數。對所獲取的匹配的引用。例如,“(.)\1”匹配兩個連續的相同字符。 |
\n | 標識一個八進制轉義值或一個向后引用。如果\n之前至少n個獲取的子表達式,則n為向后引用。否則,如果n為八進制數字(0-7),則n為一個八進制轉義值。 |
\nm | 標識一個八進制轉義值或一個向后引用。如果\nm之前至少有nm個獲得子表達式,則nm為向后引用。如果\nm之前至少有n個獲取,則n為一個后跟文字m的向后引用。如果前面的條件都不滿足,若n和m均為八進制數字(0-7),則\nm將匹配八進制轉義值nm。 |
\nml | 如果n為八進制數字(0-3),且m和l均為八進制數字(0-7),則匹配八進制轉義值nml。 |
\un | 匹配n,其中n是一個用四個十六進制數字表示的Unicode字符。例如,\u00A9匹配版權符號(?)。 |
?
四、常見正則表達式:常用的正則表達式歸納
原文首發:http://www.ido321.com/1355.html
?
轉載于:https://my.oschina.net/461147874/blog/359087
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的DOM笔记(十):JavaScript正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: awk:split()函数、数组、自定义
- 下一篇: gradle idea java ssm