正則小結一(限定符)

建立一個Regexp的兩種方式:

  1. var reg = /regexp/
  2. var reg = new RegExp('regexp')
  3. 能夠配合使用的3個標誌:
  • i : i可使正則表達式在匹配時忽略大小寫。/regexp/i
  • g : g標誌可使正則表達式匹配模式的全部實例。
  • m : 可使正則表達式跨多行(例如textarea元素的值)進行匹配。 以上這些標誌都要放在表達式的尾部(/regexp/ig),或者做爲第二個參數傳進去(new RegExp('regexp', 'ig'))。
//下面的例子演示了各類標誌的用法,以及它們是如何影響模式匹配的:

var pattern = /orange/; 
console.log(pattern.test("orange")); // true

var patternIgnoreCase = /orange/i;
console.log(patternIgnoreCase.test("Orange")); // true

var patternGlobal = /orange/ig;
console.log(patternGlobal.test("Orange Juice")); // true
複製代碼

嚴格匹配模式

任何非正則表達式字符或操做符的字符序列,表明的都是該字符自己:
var parttern = /orange/;
咱們不多采用嚴格匹配,由於這和直接比較兩個字符串沒什麼分別。嚴格匹配有時候也 叫做簡化模式(simple pattern)。正則表達式

匹配字符組

若是想匹配一組字符,能夠放到[]中來。例如[abc]就表示a,b,c中的任意一個字符。數組

var pattern = /[abc]/;
console.log(pattern.test('a')); //true
console.log(pattern.test('d')); //false
複製代碼

也能夠在模式開頭加一個^(脫字符)來表示不想匹配到的內容。瀏覽器

var pattern = /[^abc]/;
console.log(pattern.test('a')); //false
console.log(pattern.test('d')); //true
複製代碼

這種模式還有另外一種很重要的用法是用來指明值的範圍。若是想匹配字符或數字的某個連續 範圍,可使用下面的模式:bash

var pattern = /[0-5]/;
console.log(pattern.test(3)); //true 
console.log(pattern.test(12345)); //true 
console.log(pattern.test(9)); //false 
console.log(pattern.test(6789)); //false 
console.log(/[0123456789]/.test("This is year 2015")); //true
複製代碼

咱們能夠看到:[ , ] , ^ , $ , .等字符都是具備特殊含義的字符。那要配配它們的字面量的含義,要怎麼作?
加一個\(反斜線字符)就行了。[ 匹配的就是一個普通的字符[, 而不是字符組的開括號。雙\\表示一個普通的字符 \ 。函數

補充:^的兩種含義:

能夠運用到開發中的:exec() 和 match() 和 replace()方法

  1. 在正則中有exec()方法,以下示例:

  1. String對象的方法中有match()方法,以下示例:

能夠看到兩種方法結果是一致的。查找不到的時候則返回null。學習

  1. String對象的方法replace()方法實現字符的替換:
var strToMatch = 'Blue is your favorite color ? blue?'; 
var regExAt = /Blue/ig; 
console.log(strToMatch.replace(regExAt, "Red"));
//輸出:Red is your favorite color ? Red?
複製代碼

或者,第二個參數接受一個函數:ui

var strToMatch = 'Blue is your favorite color ?';
var regExAt = /Blue/;
console.log(strToMatch.replace(regExAt, function(matchingText){
  return 'Red';
}));
// 輸出"Red is your favorite color ?"
複製代碼
  1. String對象的split()方法也能夠接受正則表達式做爲參數並返回一個數組,該數組中包含 了通過分割後的全部子串:
var sColor = 'sun,moon,Stars';
var reComma = /[n,s]/i; 
console.log(sColor.split(reComma));
//輸出: ["", "u", "", "moo", "", "", "tar", ""]
複製代碼
  1. 使用簡單字符組就能夠匹配多個模式。假如想匹配cat、bat和fat,下面的代碼片斷展現了 具體的作法:
var strToMatch = 'wooden bat, smelly Cat,a fat cat';
var re = /[bcf]at/gi;
var arrMatches = strToMatch.match(re);
console.log(arrMatches);
//輸出:["bat", "Cat", "fat", "cat"]
複製代碼
  1. 如你所見,這種用法能夠寫出更簡潔的正則表達式。來看下面的例子:
var strToMatch = 'i1,i2,i3,i4,i5,i6,i7,i8,i9';
var re = /i[0-5]/gi;
var arrMatches = strToMatch.match(re);
console.log(arrMatches);
//輸出:["i1", "i2", "i3", "i4", "i5"]
複製代碼

快捷寫法:

寫法 含義
\d 任意的單個數字字符
\w 任意的單個字母或數字字符
\s 任意的單個空白字符(空格、製表符、換行符等)
\D 任意的單個非數字字符
\W 任意的單個非字母或數字字符
\s 任意的單個非空白字符
. 除換行符以外的任意單個字符
  1. 這些快捷寫法是書寫簡潔的正則表達式的關鍵。看下面的例子:
var strToMatch = '123-456-7890';
var re = /\d\d\d-\d\d\d/;
var arrMatches = strToMatch.match(re);
console.log(arrMatches);
//["123-456"]
複製代碼
  1. 解決重複出現的重複限定符:
寫法 含義
? 出現0次或1次(將模式視爲可選的)
* 出現0次或屢次
+ 出現1次或屢次
{n} 只出現n次
{n,m} 出現n到m次
{n, } 至少出現n次
{ ,n} 出現0到n次
  1. \b(邊界匹配符)的用法:一邊是單詞字符(字母、數字或下劃線),另外一邊是 非單詞字符。
    下面的例子是一個簡單的字面匹配。若是cat是一個子串的話,也可以成功匹配:
//非子串:
console.log(/cat/.test('a black cat')); //true

//子串:
console.log(/cat/.test('a blackcat')); //true
複製代碼

下面是使用了 \b 之後的例子:this

//非子串:
console.log(/\bcat/.test('a black cat')); //true

//子串:
console.log(/\bcat/.test('a blackcat')); //false
console.log(/\bcat/.test('a cataa')); //true
console.log(/\bcat\b/.test('a blackcat')); //false
console.log(/\bcat\b/.test('a cat')); //true
複製代碼

** \b 做用:** 上面的解釋仍是有點模糊,\b表示的是字符與字符之間看不見的東西(空格)。
若是想匹配cat字符串的話,須要寫成:/\bcat\b/
詳細解釋看下圖:spa

exec的用法:
exec()方法在獲取匹配信息方面頗有用,由於它會返回一個包含匹配信息的對象。exec() 返回的對象有一個index屬性,能夠告訴咱們成功匹配出如今字符串中的哪一個位置。這個功能在 很多地方都能派上用場:code

var match = /\d+/.exec("There are 100 ways to do this");
    console.log(match);
    // ["100"]
    console.log(match.index);
// 10
複製代碼

()組合符的用法:
選擇結構可使用|(管道符)來表示。例如,/a|b/能夠匹配字符a或b,/(ab)+|(cd)+/ 能夠匹配一個或多個ab或cd。

首部(^)與尾部($)

咱們常常須要確保模式在字符串的首部或尾部進行匹配。當脫字符(^)用做正則表達式的 第一個字符的時候,能夠將匹配過程鎖定在字符串的開頭,所以,/^test/只可以匹配出如今待 匹配字符串起始位置上的test子串。與此相似,美圓符號()表示模式必須出如今字符串的尾部: /test/。
^和配合使用,代表指定的模式必須涵蓋整個待匹配的字符串:/^test/。

向後引用

在字符串String使用replace()方法時,可使用特殊的字符序列$1,$2...來表示對應的分組。

var orig = "1234 5678";
var re = /(\d{4}) (\d{4})/;
var modifiedStr = orig.replace(re, "$2 $1"); 
console.log(modifiedStr); // 輸出"5678 1234"
複製代碼

貪婪限定符(全部限定符) 與 惰性限定符(?)

例如,模式\d+可以匹配一個或多個數字。若是字符串是123的話,貪婪匹配能夠匹配到一、 12和123。貪婪模式h.+1能夠匹配字符串hello中的hell——這是可以匹配的最長的字符串。 由於\d+是貪婪匹配,因此它會盡量多地匹配數字,故最後的匹配結果就是123。
與貪婪限定符相反,惰性限定符則是儘量少地匹配字符。能夠在正則表達式後面加上問號 (?),使其成爲惰性匹配。惰性模式h.?l能夠匹配字符串hello中的hel—— 這是可以匹配到的最短的字符串。
模式\w*?X能夠匹配到0個或多個單詞以及一個X。可是*後的?表示應該儘量少地匹配字 符。對於字符串abcXXX,匹配結果能夠是abcX、abcXX或abcXXX,那究竟應該匹配哪個呢? 由於*?是惰性模式,因此應該儘量少地匹配,所以最後的匹配結果是abcX。
刪除字符串首尾多餘的空白字符是一個極其常見的用法。直到最近,String對象自己都沒有 trim()方法,一些JavaScript庫爲沒有String.trim()方法的舊瀏覽器提供了字符串修剪功能。 最經常使用的方法以下所示:

function trim(str) {
   return (str || "").replace(/^\s+|\s+$/g,"");
}
console.log("--"+trim(" test ")+"--");
//"--test--"

//若是咱們想把重複的空白字符替換成單個呢?

 re=/\s+/g;
 console.log('There are a lot of spaces'.replace(re,' '));
 //"There are a lot of spaces"
複製代碼

在上面的代碼片斷中,咱們嘗試匹配一個或多個空格字符序列,而後將其替換成單個空格。 如你所見,正則表達式就像是JavaScript兵器庫中的一把瑞士軍刀。從長遠來看,細心學習、 充分實踐,將爲你帶來豐厚的長期回報。

相關文章
相關標籤/搜索