1. 程式人生 > >正則2

正則2

修飾符 沒有 現在 次數 每一個 ignorecas lin ... 普通


實例創建字面量創建的區別:
1、實例創建的方式需要多轉譯一次,把具有特殊意思並且帶\的都要多轉譯一次
var reg = /\d/;
var reg = new RegExp("\\d");

2、在字面量方式中,用"//"包起來的都是我們的元字符,有具有特殊意義的元
字符、代表出現次數的量詞元字符、代表本身意思的普通元字符字面量方式無法識別變量,實例創建的方式可以
var c = "w100";
var reg = /^"+c+"$/;以"開頭,出現一到多次,然後是c出現一到多次,最後以"結尾,而不是認為字符串拼接
var reg = new RegExp("^" + c + "$");只能包含w100的 /^w100$/

正則中還包含修飾符:

i(ignoreCase 忽略大小寫)、m(multiline 匹配換行)、g(global 全局匹配)
var reg = /^[a-z]$/i;
var reg = new RegExp("^[a-z]$", "i");
console.log(reg.test("Z"));



exec:正則捕獲的方法
1、首先拿我們的字符串正則進行匹配,如果不匹配,捕獲的結果是null
2、只有匹配才按照我們的規則進行捕獲

正則的捕獲是貪婪的,默認按照匹配最長的捕獲,例如:捕獲的是2016而不是2如何取消正則的貪婪性:在量詞元字符後面加?即可,?出現在普通元字符後面代表出現0-1次、如果出現在量詞元字符後面代表取消正則的貪婪性

正則的捕獲是懶惰的,默認只捕獲第一個匹配到的,例如:只得到了
2016但是沒有獲取2017,可以加一個全局的修飾符g,需要捕獲幾次我們就執行幾次,這樣就能都捕獲到了
var reg = /\d+?/g;
var str = "beijing2016dongjing2017";
var ary = [];
var res = reg.exec(str);
while (res) {
ary.push(res[0]);第一項是捕獲到的內容
//console.log(res[0]); 2 0 1 6 2 0 1 7
res = reg.exec(str);
}
console.log(ary
);//"2", "0", "1", "6", "2", "0", "1", "7"]
通過exec如果可以獲取到內容的話是一個數組

例如:["2016", index: 7, input: "beijing2016dongjing2017"]
第一項是捕獲到的內容;index是捕獲開始的索引;input我們捕獲的那個原始的字符串


分組:用小括號包起來的就是一個分組,也是大正則中的一個小的正則
1、改變默認優先級 x|y:x或者y
2、可以進行分組捕獲
捕獲到的是一個數組:第一項是大正則捕獲的內容,接下來分別是每一個小分組捕獲的內容,index是大正則捕獲的開始索引
var reg=/(\d+)([a-z]+)/;
console.log(reg.exec("beijing2016dongjing2017"));
var ary=["2016dongjing", "2016", "dongjing", index: 7, input: "beijing2016dongjing2017"]
"2016dongjing" 大正則捕獲的內容 ary[0]
"2016" 第一個分組捕獲的內容 ary[1]
"dongjing" 第二個分組捕獲的內容 ary[2]

不想捕獲第二個分組中的內容,只需要在小括號中加?:即可
?: 在分組的最前面只匹配不捕獲
var reg=/(\d+)(?:[a-z]+)/;
console.log(reg.exec("beijing2016dongjing2017"));

字符串中也有一個捕獲的方法:match
不加全局匹配符g的時候,和exec一樣,大正則和分組的內容都可以捕獲到,g的時候,雖然執行一次,但是可以把所有大正則匹配的內容都捕獲到了(而exec需要多次),但是math在加上g的時候不能捕獲小分組中的內容
var reg = /(\d+)/g;
var str = "beijing2016dongjing2017";
console.log(str.match(reg));// 結果和var reg = /\d+/g的結果一樣["2016", "2017"],即不能捕獲小分組中的內容;

console.log(reg.exec(str));//["2016", "2016", index: 7, input: "beijing2016dongjing2017"]


分組引用:當發現正則中的某一部分需要和另外一部分匹配的內容的一模一樣才可以,這樣的情況用分組引用來解決

var reg = /(\d+)beijing\1/;//\1就是對第一個分組的引用
\1代表的是和第一個分組(\d+)一模一樣的內容
console.log(reg.test("2016beijing2016"));//true
console.log(reg.test("2016beijing2017"));//false

例如:foot wood good ... 中間兩個字母需要一模一樣
var reg = /^[a-zA-Z]([a-zA-Z])\1[a-zA-Z]$/;
console.log(reg.test("foot"));

正則2