前言
記得上一次系統的學習正規表示式,還是剛學前端的事,現在過去那麼久了,現在有必要將正則給補一補,也許這一次會有不同的感悟。
正則的速查表
字元 | 詳細 |
---|---|
\ | 將下一個字元標記為一個特殊字元、或一個原義字元、或一個向後引用、或一個八進位制轉義符。例如,“n “匹配字元”n “。”\n “匹配一個換行符。序列”\\ “匹配”\ “而”\( “則匹配”( “。 |
^ | 匹配輸入字串的開始位置。如果設定了RegExp 物件的Multiline 屬性,^ 也匹配“\n ”或“\r ”之後的位置。 |
$ | 匹配輸入字串的結束位置。如果設定了RegExp 物件的Multiline 屬性,$ 也匹配“\n ”或“\r ”之前的位置。 |
* | 匹配前面的子表示式零次或多次。例如,zo *能匹配“z “以及”zoo “。*等價於{0, 。 |
+ | 匹配前面的子表示式一次或多次。例如,“zo+ “能匹配”zo “以及”zoo “,但不能匹配”z “。+ 等價於{1, }。 |
? | 匹配前面的子表示式零次或一次。例如,“do(es)? ”可以匹配”does “或”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< 。最少匹配n次且最多匹配m 次。例如,”o{1,3 “將匹配”fooooood “中的前三個o 。”o{0,1 “等價於”o? “。請注意在逗號和兩個數之間不能有空格。 |
? | 當該字元緊跟在任何一個其他限制符(*,+,?,{n 後面時,匹配模式是非貪婪的。非貪婪模式儘可能少的匹配所搜尋的字串,而預設的貪婪模式則儘可能多的匹配所搜尋的字串。例如,對於字串”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 ”。預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜尋,而不是從包含預查的字元之後開始 |
(?< =pattern) |
反向肯定預查,與正向肯定預查類擬,只是方向相反。例如,“(?< ”能匹配“2000Windows ”中的“Windows ”,但不能匹配“3.1Windows ”中的“Windows ”。 |
(?< !pattern) |
反向否定預查,與正向否定預查類擬,只是方向相反。例如“(?< ”能匹配“3.1Windows ”中的“Windows ”,但不能匹配“2000Windows ”中的“Windows ”。 |
x|y | 匹配x 或y 。例如,“z|food ”能匹配“z ”或“food ”。“(z|f)ood ”則匹配“zood ”或“food ”。 |
[xyz] | 字符集合。匹配所包含的任意一個字元。例如,“[abc] ”可以匹配“plain ”中的“a ”。 |
[^xyz] | 負值字符集合。匹配未包含的任意字元。例如,“[^abc] ”可以匹配“plain ”中的“p ”。 |
[a-z] | 匹配輸入字串的結束位置。如果設定了RegExp 物件的Multiline 屬性,$ 也匹配“\n “或”\r “之前的位置。 |
[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 ”。 |
\cx | 匹配由x指明的控制字元。例如,\cM 匹配一個Control-M 或回車符。x 的值必須為A-Z 或a-z 之一。否則,將c 視為一個原義的“c ”字元。 |
\d | 匹配一個數字字元。等價於[0-9] 。 |
\D | 匹配一個非數字字元。等價於[^0-9] 。 |
\f | 匹配一個換頁符。等價於\x0c 和\cL 。 |
\n | 匹配一個換行符。等價於\x0a 和\cJ 。 |
\r | 匹配一個回車符。等價於\x0d 和\cM 。 |
\s | 匹配任何空白字元,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v] 。 |
\S | 匹配任何非空白字元。等價於[^ \f\n\r\t\v] 。 |
\t | 匹配一個製表符。等價於\x09 和\cI 。 |
\v | 匹配一個垂直製表符。等價於\x0b 和\cK 。 |
\w | 匹配包括下劃線的任何單詞字元。等價於“[A-Za-z0-9_] ”。 |
\W | 匹配任何非單詞字元。等價於“[^A-Za-z0-9_] ”。 |
\xn | 匹配n ,其中n 為十六進位制轉義值。十六進位制轉義值必須為確定的兩個數字長。例如,“\x41 ”匹配“A ”。“\x041 ”則等價於“\x04& ”。正規表示式中可以使用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 匹配版權符號(©) 。 |
使用正規表示式的方法
方法 | 描述 |
---|---|
exec | 一個在字串中執行查詢匹配的RegExp方法,它返回一個陣列(未匹配到則返回null)。 |
test | 一個在字串中測試是否匹配的RegExp方法,它返回true或false。 |
match | 一個在字串中執行查詢匹配的String方法,它返回一個陣列或者在未匹配到時返回null。 |
search | 個在字串中測試匹配的String方法,它返回匹配到的位置索引,或者在失敗時返回-1。 |
replace | 一個在字串中執行查詢匹配的String方法,並且使用替換字串替換掉匹配到的子字串。 |
split | 一個使用正規表示式或者一個固定字串分隔一個字串,並將分隔後的子字串儲存到陣列中的String方法。 |
當你想要知道在一個字串中的一個匹配是否被找到,你可以使用test
或search
方法;想得到更多的資訊(但是比較慢)則可以使用exec
或match
方法。如果你使用exec
或match
方法並且匹配成功了,那麼這些方法將返回一個陣列並且更新相關的正規表示式物件的屬性和預定義的正規表示式物件(詳見下)。如果匹配失敗,那麼exec
方法返回null
(也就是false
)。
var myRe = /d(b+)d/g;
var myArray = myRe.exec("cdbbdbsbz");
複製程式碼
輸出:
["dbbd", "bb", index: 1, input: "cdbbdbsbz", groups: undefined]複製程式碼
-
["dbbd", "bb"]
匹配到的字串和所有被記住的子字串。 -
index
在輸入的字串中匹配到的以0開始的索引值。 -
input
初始字串。 -
lastIndex
下一個匹配的索引值。(這個屬性只有在使用g引數時可用在 通過引數進行高階搜尋 一節有詳細的描述.) -
source
模式文字。在正規表示式建立時更新,不執行。
使用括號的子字串匹配
一個正規表示式模式使用括號,將導致相應的子匹配被記住。例如,/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複製程式碼
通過標誌進行高階搜尋
正規表示式有四個可選引數進行全域性和不分大小寫搜尋。這些引數既可以單獨使用也可以一起使用在任何順序和包含正規表示式的部分中。
標誌 | 描述 |
---|---|
g | 全域性搜尋 |
i | 不區分大小寫搜尋 |
m | 多行搜尋 |
y | 執行“粘性”搜尋,匹配從目標字串的當前位置開始,可以使用y標誌。 |
例子
給一個連字串例如:get-element-by-id轉化成駝峰形式。
var str = "get-element-by-id";
var reg = /-\w/g;
str.replace(reg, (val) =>
{
return val.slice(1).toUpperCase();
});
//"getElementById"複製程式碼
匹配二進位制數字
- 方法一
var str = "10101111";
var reg = /^[01]+$/g;
console.log(reg.test(str));
複製程式碼
- 方法二
var str = "81";
var reg = /^(?!0)\d+$/;
console.log(reg.test(str));
複製程式碼
- 方法三
var str = "0101212312";
var reg = /^[^0]\d+$/g;
console.log(reg.test(str));
//false複製程式碼
分割數字每三個以一個逗號劃分
var str = "12345678901";
function numSplit(str){
var re = /(\d)(?=(\d{3
})+$)/g;
//(\d{3
})+$ 的意思是連續匹配 3 個數字,且最後一次匹配以 3 個數字結尾。 //要找到所有的單個字元,這些字元的後面跟隨的字元的個數必須是3的倍數,並在符合條件的單個字元後面新增, return str.replace(re,'$1,');
}console.log(numSplit(str));
//12,345,678,901複製程式碼
如何獲取一個字串中的數字字元,並按陣列形式輸出
var str="dgfhfgh254bhku289fgdhdy675";
var re=/(\d+)/g;
console.log(str.match(re));
複製程式碼
求一串字串中出現次數最多的字元和其出現的次數
var str = "qjvj58h7vv9n57v55v5jj";
var n = -1;
while ((new RegExp("(.)(.*?\\1){"+(++n)+"
}")).test(str));
console.log("出現次數最多的字元是 "+RegExp.$1+",出現次數 "+n);
複製程式碼
解釋一下
.
代表任意一個字元。(.)
選擇任意一個字元進行復制。.*
代表任意一個字元後面有0個或者多個字元。(.)(.*\\1)
是否存在一個或多個字元與它相同。(.)(.*?\\1)
表示是非貪婪模式。\1
匹配和正規表示式中的括號(計算左括號)中出現相同內容的內容,數字代表匹配第幾個括號。\\1
代表第一個圓括號裡面的內容是否相同。
壓縮字串(例如:abcbc壓縮後依然是abcbc,而xxxyyyyyyz壓縮後就是3x6yz)
var str = "xxxyyyyyyz";
str = str.replace(/(.)\1+/ig,function(s,a){return s.length+a;
});
console.log(str);
複製程式碼
i
不區分大小寫
判斷是否含有連續字元
var str = 'a2s3s2d2d3dsfas';
var reg = /(\w)\1/igconsole.log(reg.test(str));
複製程式碼
匹配一個字串中的正浮點數
var reg = /(0.\d+)|(\d+.\d+)/;
console.log(reg.test('0'));
// falseconsole.log(reg.test('0.5'));
// trueconsole.log(reg.test('d0.5'));
// trueconsole.log(reg.test('d0.5s'));
// trueconsole.log(reg.test('d0.a5s'));
// false複製程式碼
最後
如果有地方不合理的,麻煩提出來一下