——————【 正規表達式 】——————
-
複習字元串操作
indexOf 查找字元 傳回位置
charAt 查找位置 傳回字元
substring 擷取字元竄
split 分割字元串
-
正規表達式的概念和寫法
正則 :也叫做規則,讓計算機能夠讀懂人類的規則
正則都是操作字元串的。
正則的寫法:
var re = /a/; //和數組字元串區分開來
var re = newRegExp('a');
【正則預設】 :
1.正則中是區分大小寫的
不區分大小寫在正則後加 表示i (ignore)
如var re = newRegExp('a','i');
2.正則比對成功就會結束,不會繼續比對,
如果想全部查找就要加 辨別g (global)
-
量詞:代表出現的次數
量詞 描述
n+ 比對任何包含至少一個 n 的字元串。
n* 比對任何包含零個或多個 n 的字元串。
n? 比對任何包含零個或一個 n 的字元串。
n{X} 比對包含 X 個 n 的序列的字元串。
n{X,Y} 比對包含 X 至 Y 個 n 的序列的字元串。
n{X,} 比對包含至少 X 個 n 的序列的字元串。
n$ 比對任何結尾為 n 的字元串。
^n 比對任何開頭為 n 的字元串。
?=n 比對任何其後緊接指定字元串 n 的字元串。
?!n 比對任何其後沒有緊接指定字元串 n 的字元串。
>{n,m}:至少出現n次,最多m次
>{n,} :至少n次
>* :任意次 相當于{0,}
? :零次或一次 相當于{0,1}
+ :一次或任意次相當于 {1,}
{n}: 正好n次
例子:判斷是不是QQ号
//^ : 放在正則的最開始位置,就代表起始的意思,注意 /[^a] / 和
/^[a]/是不一樣的,前者是排除的意思,後者是代表首位。
//$ : 正則的最後位置 , 就代表結束的意思
//首先想QQ号的規則
1 首位不能是0
2 必須是 5-12位的數字
var aInput = document.getElementsByTagName('input');
var re = /^[1-9]\d{4,11}$/;
//123456abc為了防止出現這樣的情況,是以必須限制最後
//首位是0-9,接着是4-11位的數字類型。
aInput[1].onclick = function(){
if( re.test(aInput[0].value) ){
alert('是QQ号');
}else{
alert('不是QQ号');
}
};
例子:去掉前後空格(面試題經常出現)
var str = ' hello ';
alert( '('+trim(str)+')' );//為了看出差別是以加的括号。 (hello)
function trim(str){
var re = /^\s+|\s+$/g; // |代表或者 \s代表空格 +至少一個 前面有至少一個空格 或者後面有至少一個空格 且全局比對
return str.replace(re,''); //把空格替換成空
}
-
貪婪模式與反貪婪模式
*、+和?限定符都是貪婪的,因為它們會盡可能多的比對文字,隻有在它們的後面加上一個?就可>以實作非貪婪或最小比對。
var c="qqq icbkb coiwcnk tyu kjanc alnc"
var reg =/\w{4,7}/g
console.log(c.match(reg))// ["icbkb", "coiwcnk", "kjanc", "alnc"]
var reg =/\w{4,7}?/g
console.log(c.match(reg)) ["icbk", "coiw", "kjan", "alnc"]
-
正規表達式邊界及前瞻
-
邊界
整個字元串開頭( ^ ) 結尾( $ )
單詞的邊界 (b), (B)
-
前瞻
正向前瞻 reg (? = assert)
反向前瞻 reg (?! = assert)
-
正則的對象屬性
屬性 描述global RegExp 對象是否具有标志 g。
ignoreCase RegExp 對象是否具有标志 i。
lastIndex 一個整數,标示開始下一次比對的字元位置。
multiline RegExp 對象是否具有标志 m。
source 正規表達式的源文本。
-
正規表達式的使用
-
RegExp 對象方法
方法 描述
compile 編譯正規表達式。
exec 檢索字元串中指定的值。傳回找到的值,并确定其位置。
test 檢索字元串中指定的值。傳回 true 或 false。
-
支援正規表達式的 String 對象的方法
方法 描述
search 檢索與正規表達式相比對的值。
match 找到一個或多個正規表達式的比對。
replace 替換與正規表達式比對的子串。
split 把字元串分割為字元串數組。
-
test() :在字元串中查找符合正則的内容,若查找到傳回true,反之傳回false.
用法正則.test(字元串)
例子:判斷是否是數字
var str = '374829348791';
var re = /\D/; // \D代表非數字
if( re.test(str) ){ // 傳回true,代表在字元串中找到了非數字。
alert('不全是數字');
}else{
alert('全是數字');
}
-
search() :在字元串搜尋符合正則的内容,搜尋到就傳回出現的位置(從0開始,如果比對的不隻是一個字母,那隻會傳回第一個字母的位置), 如果搜尋失敗就傳回 -1
用法:字元串.search(正則)
在字元串中查找複合正則的内容。忽略大小寫:i——ignore(正則中預設是區分大小寫的 如果不區分大小寫的話,在正則的最後加辨別 i )
例子:在字元串中找字母b,且不區分大小寫
var str = 'abcdef';
var re = /B/i;
//var re = new RegExp('B','i'); 也可以這樣寫
alert( str.search(re) ); // 1
-
match() 在字元串中搜尋複合規則的内容,搜尋成功就傳回内容,格式為數組,失敗就傳回null。
用法: 字元串.match(正則)
量詞:+ 至少出現一次 比對不确定的次數(比對就是搜尋查找的意思)
全局比對:g——global(正則中預設,隻要搜尋到複合規則的内容就會結束搜尋 )
例子:找出指定格式的所有數字,如下找到 123,54,33,879
var str = 'haj123sdk54hask33dkhalsd879';
var re = /\d+/g; // 每次比對至少一個數字 且全局比對
如果不是全局比對,當找到數字123,它就會停止了。
就隻會彈出123.加上全局比對,就會從開始到結束一直去搜尋符合規則的。
如果沒有加号,比對的結果就是1,2,3,5,4,3,3,879并不是我們想要的,有了加号,每次比對的數字就是至少一個了。
alert( str.match(re) ); // [123,54,33,879]
-
replace() :查找符合正則的字元串,就替換成對應的字元串。傳回替換後的内容。
用法: 字元串.replace(正則,新的字元串/回調函數)(在回調函數中,第一個參數指的是每次比對成功的字元)
| : 或的意思 。
例子:敏感詞過濾,比如 >我愛北京天安門,天安門上太陽升。------我愛*,上太陽升。即北京和天安門變成*号,
一開始我們可能會想到這樣的方法:
var str = "我愛北京天安門,天安門上太陽升。";
var re = /北京|天安門/g; // 找到北京 或者天安門 全局比對
var str2 = str.replace(re,'*');
alert(str2) //我愛**,*上太陽升
//這種隻是把找到的變成了一個*,并不能幾個字就對應幾個*。
要想實作幾個字對應幾個*,我們可以用回調函數實作:
var str = "我愛北京天安門,天安門上太陽升。";
var re = /北京|天安門/g; // 找到北京 或者天安門 全局比對
var str2 = str.replace(re,function(str){
alert(str); //用來測試:函數的第一個參數代表每次搜尋到的符合正則的字元,是以第一次str指的是北京 第二次str是天安門 第三次str是天安門
var result = '';
for(var i=0;i<str.length;i++){
result += '*';
}
return result; //是以搜尋到了幾個字就傳回幾個*
});
alert(str2) //我愛*****,***上太陽升
//整個過程就是,找到北京,替換成了兩個*,找到天安門替換成了3個*,找到天安門替換成3個*。
replace是一個很有用的方法,經常會用到。
-
():,小括号,叫做分組符。就相當于數學裡面的括号。如下:
var str = '2013-6-7';
var re1 = /\d-+/g; // 全局比對數字,橫杠,橫杠數量至少為1,比對結果為: 3- 6-
var re1 = /(\d-)+/g; // 全局比對數字,橫杠,數字和橫杠整體數量至少為1 3-6-
var re2 = /(\d+)(-)/g; // 全局比對至少一個數字,比對一個橫杠 比對結果:2013- 6-
-
[] : 表示某個集合中的任意一個,比如 [abc] 整體代表一個字元 比對 a b c 中的任意一個,也可以是範圍,[0-9] 範圍必須從小到大 。
1 整體代表一個字元 :^寫在[]裡面的話,就代表排除的意思
例子:比對HTML标簽 比如<div class="b">hahahah </div> 找出标簽<div class="b"></div>
var re = /<2+>/g; //比對左括号
中間至少一個非右括号的内容(因為标簽裡面還有屬性等一些東西),然後比對右括号
var re = /<[wW]+>/g; //比對左括号 中間至少一個字元或者非字元的内容,然後比對右括号//
其實就是找到左括号,然後中間可以有至少一個内容,一直到找到右括号就代表是一個标簽。
-
概念了解
正規表達式是對字元串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這>>些特定字元>的組合,組成一個“規則字元串”,這個“規則字元串”用來表達對字元串的一>>種過濾邏輯。
給定一個正規表達式和另一個字元串,我們可以達到如下的目的:
- 給定的字元串是否符合正規表達式的過濾邏輯(稱作“比對”);
- 可以通過正規表達式,從字元串中擷取我們想要的特定部分。
正規表達式的特點是:
- 靈活性、邏輯性和功能性非常強;
- 可以迅速地用極簡單的方式達到字元串的複雜控制。
- a ↩
- > ↩