正則表達式是描述一組字符串特征的模式,用來匹配特定的字符串,以下從基本語法、RegExp對象的方法、JS中支持正則表達式的String對象方法三個部分對javascript正則表達式做基本介紹。
基本語法
RegExp對象的方法
JS中支持正則表達式的String對象方法
在JS中,正則表達式為對象,用如下兩種方式定義:
直接量法: /pattern/attributes;創建RegExp對象法:new RegExp(pattern,attributes);
var reg=/hi/i;//字面量 var reg=new RegExp('hi','i');//構造函數(參數1:最簡單的正則匹配字母hi;參數2:表示匹配時不分大小寫)
元字符:( [ { \ ^ $ | ) ? * + .(若匹配元字符本身需要轉義)
1、直接量
最簡單的正則匹配模式,使用字符本身進行匹配
var reg=/hi/;//匹配一個hi字符
2、元字符
元字符是一些符號和字母的組合,用來替代普通字符。
var reg=/./;// .表示除換行符以外的任一字符 var reg=/\d/;// \d表示0-9的數字 …
常用元字符詳解
3、字符轉義
如果需要查找元字符本身,則需要在元字符之前加\進行轉義。
var reg=/\./;//匹配一個. var reg=/\\/;// 匹配一個\
4、重復
量詞用于限定它前面表達式匹配的次數,有*+?{}等。
var reg=/\d\d\d/;//匹配3個數字 var reg=/\d*/;//匹配任意數量數字,可能是0個 var reg=/\d+/;//匹配1個到多個數字 var reg=/\d?/;//匹配0到1個數字 var reg=/\d{3}/;//匹配3個數字 var reg=/\d{3,}/;//匹配3到多個數字 var reg=/\d{3,6}/;//匹配3到6個數字
5、字符類
在[]的范圍中添加字符,在中括號內的元字符不需要進行轉義‘-’表示至,它的作用為在括號中任選其一。
var reg=/[abc]/;//匹配'a','b','c'其中之一 var reg=/[() +\]/;//匹配'(',')',' ','+','\'其中之一,[]內部不需要轉義 var reg=/[0-9a-z]/;//匹配0至9和a至z,即[0123456789abcdefghijklmnopqrstuvwxyz] var reg=/[0-9][a-z]/;//匹配前一個數字后一個字母的兩位字符,區別于上述匹配一位字符
6、分支條件
使用|把不同規則分隔開,類似條件選擇,從左到右依次測試每個條件,滿足其中任一條件即可,當滿足某個分枝成功后就不再管其它的分支了。
var reg=/0\d{2}-\d{8}|0\d{3}-\d{7}/;//匹配固定電話:前3后8或前4后7,即021-12345678或0553-7654321
7、分組
使用()來包裹子表達式,以便對這部分子表達式整體操作,如重復或后向引用。
var reg=/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/;//匹配IP地址 //意思為:((一個不大于255的數字)+‘.’)整體重復三次+(一個不大于255的數字)
8、反義
查找不屬于指定類型以外的字符,有\D\W\S[^]等,其中\D等價于[^\d] 除數字以外任意字符。
var reg=/[^abc]/;//匹配一個不是abc的字符,即除abc以外的任一字符
9、后向引用
使用()分組匹配的子表達式,將自動擁有一個分組編號,可用于后續重復引用。
var reg=/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}\2/;//這里有分組有嵌套,\1代表外層分組(下劃線),\2表示內層分組(紅色)
可以自定義分組編號(即命名)語法為:(?<name>exp)或(?’name’exp),將分組命名為name,再反向引用時語法為:\k<name>
var reg=/((?<name>2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}\k<name>/;//給分組2命名為name,后續可用該名稱來引用
還可以忽略當前分組獲得自動編號(即隱藏分組),語法為(?:exp)
var reg=/(?:(2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}\1/;//因為第一個分組被忽略,原來的分組2變為了分組1
10、零寬度斷言(也稱環視)
用于查找在某些內容(但并不包括這些內容)之前或之后的東西,類似\b^$指定一個位置,這個位置要滿足一定的條件(斷言)
(?=exp)正前瞻,自身出現的位置的后面能匹配表達式exp,如:\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分,等同于下劃線部分
(?!exp)反前瞻,自身出現的位置的后面不能匹配表達式exp,如:\babc(?!ing\b),匹配不以ing結尾的abc開頭單詞的abc,等同于下劃線部分
(?<=exp)正后顧,自身出現的位置的前面能匹配表達式exp,如:(?<=\bre)\w+\b,匹配以re開頭的單詞的后半部分,等同于下劃線部分(JS不支持)
(?<!exp)反后顧,自身出現的位置的前面不能匹配表達式exp,如:(?<!\bre)abc\b,匹配以re開頭的abc結尾單詞的abc,等同于下劃線部分(JS不支持)
var str='reading'; var reg=/read(?=ing)/g;//正前瞻:在我們捕獲read這個字符串時,篩選它接下來的字符串是不是ing console.log(str.match(reg)[0]);//read
11、貪婪和懶惰
正則表達式匹配時,通常在使整個表達式能得到匹配的前提下,會匹配盡可能多的字符,這被稱為貪婪匹配若需要懶惰匹配(即盡可能少的字符),那么只要在限定重復的軟性量詞后加?即可
var str='aabab'; console.log(str.match(/a.*b/)[0]);//aabab 默認貪婪模式 console.log(str.match(/a.*?b/)[0]);//aab 開啟懶惰模式
12、處理選項
即匹配規則,是否忽略大小寫,多行等
1、test()
基本語法:RegExpObject.test(str);
該方法用于檢測一個字符串是否匹配某個模式(即給定的字符串使用該正則是否能匹配到內容),返回一個布爾值
var str="hello world"; var regexp=new RegExp("hello");//構造函數創建RegExp對象 console.log(regexp.test(str));//true console.log(/hi/.test(str));//false,//字面量
2、exec()
基本語法:RegExpObject.exec(str);
該方法用于檢索字符串中的正則表達式的匹配,返回一個匹配結果的數組,如果沒有匹配返回null;不是全局的情況下與match()方法返回的數值相同
var str="hello world"; console.log(/hello/.exec(str));//["hello", index: 0, input: "hello world"] //第一為匹配的內容,第二為匹配的索引位置,第三為字符串本身 console.log(/hi/.exec(str));//null console.log(/ello/.exec(str).index);//1 //index和input可以直接作為該方法返回的兩個屬性
1、search()
查找:stringObject.search(regexp/str);
該方法用于檢索字符串中指定的子字符串,或檢索與正則表達式相匹配的字符串,它不執行全局匹配(將忽略標志g),也沒有regexp對象的lastIndex屬性,且總是從字符串開始位置進行查找,總是返回的是stringObject匹配的第一個位置
var str = "hello"; console.log(str.search(/l/)); //2 返回匹配到的第一個位置(使用的regexp對象檢索) console.log(str.search('l')); //2 使用字符串進行匹配 console.log(str.search(/l/g)); //2 沒有全局的概念 總是返回匹配到的第一個位置 console.log(str.search(/L/i)); //2 可以忽略大小寫來檢索 console.log(str.search(/a/)); //-1,如果沒有檢索到的話,則返回-1
2、match()
匹配:stringObject.match(regexp/str)
該方法用于在字符串內檢索指定的值,或找到一個或者多個正則表達式的匹配。該方法類似于indexOf()或者lastIndexOf(); 但是它返回的是指定的值,而不是字符串的位置;
var str = "hello"; console.log(str.match(/e/)); //["e", index: 1, input: "hello"] 返回一個數組,包括匹配到的字符,位置和自身 console.log(str.match('e'));//["e", index: 1, input: "hello"] 支持用字符串代替正則進行匹配 console.log(str.match(/l/g));//["l", "l"]支持全局匹配,返回匹配到的字符組成的數值
3、replace()
替換:stringObject.replace(regexp/str,str/function);
該方法用于在字符串中使用一些字符替換另一些字符,或者替換一個與正則表達式匹配的子字符串;默認只替換第一個匹配的字符,可以加修飾符g進行全局替換。整體返回替換后的新字符串。
var str = "hello world"; console.log(str.replace("hello","a"));// a world,使用字符串匹配并替換 console.log(str.replace(/hello/,"b"));// b world,使用正則匹配并替換 console.log(str.replace(/l/g,""));// heo word,使用正則加裝飾符g進行全局替換 console.log(str.replace(/(hello)[ ](\w+)/g,"$2 $1"));// world hello,$1,$2 代表正則中第一個和第二個分組所匹配的文本 //第二個參數是function函數 console.log(str.replace(/o/g,function(v){ console.log(v);//打印2次o return '-'; }));//hell- w-rld,匹配替換為函數的返回值 console.log(str.replace(/(e).*(o)\b/g,function(){ console.log(arguments);//["ello", "e", "o", 1, "hello world"] //第一個匹配的字符,第二和第三是分組匹配的內容,第四是匹配索引位置,第5個是原字符串 return 'i'; }));// hi world
4、split()
分割:stringObject.split(regexp/substr,[length]);
該方法把一個字符串分割成字符串數組,length設定返回數組的長度即超出部分將被忽略(可選參數)
var str = "hello world"; console.log(str.split(" ");//["hello", "world"],使用字符分割為數組 console.log(str.split(/o/g));//["hell", " w", "rld"],使用正則匹配的內容來分割 console.log(str.split(/o/g,2));//["hell", " w"],指定返回數組的length
回答所涉及的環境:聯想天逸510S、Windows 10。
正則表達式是描述一組字符串特征的模式,用來匹配特定的字符串,以下從
基本語法、RegExp對象的方法、JS中支持正則表達式的String對象方法三個部分對javascript正則表達式做基本介紹。一、基本語法
在JS中,正則表達式為對象,用如下兩種方式定義:
直接量法: /pattern/attributes;創建RegExp對象法:new RegExp(pattern,attributes);
元字符:( [ { \ ^ $ | ) ? * + .(若匹配元字符本身需要轉義)
1、直接量
最簡單的正則匹配模式,使用字符本身進行匹配
2、元字符
元字符是一些符號和字母的組合,用來替代普通字符。
常用元字符詳解
3、字符轉義
如果需要查找元字符本身,則需要在元字符之前加\進行轉義。
4、重復
量詞用于限定它前面表達式匹配的次數,有*+?{}等。
5、字符類
在[]的范圍中添加字符,在中括號內的元字符不需要進行轉義‘-’表示至,它的作用為在括號中任選其一。
6、分支條件
使用|把不同規則分隔開,類似條件選擇,從左到右依次測試每個條件,滿足其中任一條件即可,當滿足某個分枝成功后就不再管其它的分支了。
7、分組
使用()來包裹子表達式,以便對這部分子表達式整體操作,如重復或后向引用。
8、反義
查找不屬于指定類型以外的字符,有\D\W\S[^]等,其中\D等價于[^\d] 除數字以外任意字符。
9、后向引用
使用()分組匹配的子表達式,將自動擁有一個分組編號,可用于后續重復引用。
可以自定義分組編號(即命名)語法為:(?<name>exp)或(?’name’exp),將分組命名為name,再反向引用時語法為:\k<name>
還可以忽略當前分組獲得自動編號(即隱藏分組),語法為(?:exp)
10、零寬度斷言(也稱環視)
用于查找在某些內容(但并不包括這些內容)之前或之后的東西,類似\b^$指定一個位置,這個位置要滿足一定的條件(斷言)
(?=exp)正前瞻,自身出現的位置的后面能匹配表達式exp,如:\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分,等同于下劃線部分
(?!exp)反前瞻,自身出現的位置的后面不能匹配表達式exp,如:\babc(?!ing\b),匹配不以ing結尾的abc開頭單詞的abc,等同于下劃線部分
(?<=exp)正后顧,自身出現的位置的前面能匹配表達式exp,如:(?<=\bre)\w+\b,匹配以re開頭的單詞的后半部分,等同于下劃線部分(JS不支持)
(?<!exp)反后顧,自身出現的位置的前面不能匹配表達式exp,如:(?<!\bre)abc\b,匹配以re開頭的abc結尾單詞的abc,等同于下劃線部分(JS不支持)
11、貪婪和懶惰
正則表達式匹配時,通常在使整個表達式能得到匹配的前提下,會匹配盡可能多的字符,這被稱為貪婪匹配若需要懶惰匹配(即盡可能少的字符),那么只要在限定重復的軟性量詞后加?即可
12、處理選項
即匹配規則,是否忽略大小寫,多行等
二、RegExp對象的方法
1、test()
基本語法:RegExpObject.test(str);
該方法用于檢測一個字符串是否匹配某個模式(即給定的字符串使用該正則是否能匹配到內容),返回一個布爾值
2、exec()
基本語法:RegExpObject.exec(str);
該方法用于檢索字符串中的正則表達式的匹配,返回一個匹配結果的數組,如果沒有匹配返回null;不是全局的情況下與match()方法返回的數值相同
三、JS中支持正則表達式的String對象方法
1、search()
查找:stringObject.search(regexp/str);
該方法用于檢索字符串中指定的子字符串,或檢索與正則表達式相匹配的字符串,它不執行全局匹配(將忽略標志g),也沒有regexp對象的lastIndex屬性,且總是從字符串開始位置進行查找,總是返回的是stringObject匹配的第一個位置
2、match()
匹配:stringObject.match(regexp/str)
該方法用于在字符串內檢索指定的值,或找到一個或者多個正則表達式的匹配。該方法類似于indexOf()或者lastIndexOf(); 但是它返回的是指定的值,而不是字符串的位置;
3、replace()
替換:stringObject.replace(regexp/str,str/function);
該方法用于在字符串中使用一些字符替換另一些字符,或者替換一個與正則表達式匹配的子字符串;默認只替換第一個匹配的字符,可以加修飾符g進行全局替換。整體返回替換后的新字符串。
4、split()
分割:stringObject.split(regexp/substr,[length]);
該方法把一個字符串分割成字符串數組,length設定返回數組的長度即超出部分將被忽略(可選參數)
回答所涉及的環境:聯想天逸510S、Windows 10。