天天看點

——————【 正規表達式 】————————————【 正規表達式 】——————

——————【 正規表達式 】——————

  • 複習字元串操作

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; //比對左括号 中間至少一個字元或者非字元的内容,然後比對右括号//

其實就是找到左括号,然後中間可以有至少一個内容,一直到找到右括号就代表是一個标簽。

  • 概念了解

正規表達式是對字元串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這>>些特定字元>的組合,組成一個“規則字元串”,這個“規則字元串”用來表達對字元串的一>>種過濾邏輯。

給定一個正規表達式和另一個字元串,我們可以達到如下的目的:

  1. 給定的字元串是否符合正規表達式的過濾邏輯(稱作“比對”);
  2. 可以通過正規表達式,從字元串中擷取我們想要的特定部分。

正規表達式的特點是:

  1. 靈活性、邏輯性和功能性非常強;
  2. 可以迅速地用極簡單的方式達到字元串的複雜控制。
  1. a ↩
  2. > ↩

繼續閱讀