javascript筆記整理系列 - JavaScript正則表達式

1 簡介

正則表達式(regular exoression)是一種描述字符串數據模式的方法。簡單來說他可以規定字符串格式,常用作字符串提取、匹配及驗證使用。

2 創建正則表達式

有兩種方式創建正則表達式:
1.使用RegExp構造函數:

var reg = new RegExp("abc");

tips:使用該方法時,需要將模式寫成普通字符串,因此反斜槓的使用規則與往常相同。
2.使用斜槓(/)將模式包圍起來,生成一個字面值

/pattern/modifiers;     /模式/修飾符
var reg = /abc/i;

3 字符串方法使用正則表達式

字符串對象的search方法用於檢索字符串,參數可傳入字符串和正則表達式。當傳入字符串時,會將字符串轉換爲正則表達式處理。

var str = "www darkclouds Top";
var result = str.search(/top/i);    //15

3.2 replace

replace() 方法 用於在字符串中用一些字符替換另一些字符,或替換一個與正則表達式匹配的子字符串。

var str = "www darkclouds Top";
var result = str.search(/top/i,"com");  //15

4 正則表達式修飾符

前面瞭解了正則表達式的語法,雙/後面的modifiers即表示修飾符,共有三個修飾符:
1. i:不區分大小寫
2. g:全局匹配(查找所有匹配而非在找到第一個匹配後停止)
3. m:執行多行匹配。

5 正則表達式模式

  1. 方括號用於查找某個範圍的字符:
    • [abc]:查找方括號之間的任何字符。
    • [0-9]:查找任何從0至9的數字。
    • (x|y):查找任何以 | 分隔的選項。
  2. 元字符是擁有特殊含義的字符:
    • \d:[0-9]:任意數字符號
    • \w:[0-z0-9]:字母和數字符號(單詞符號)
    • \s:任意空白符號(空格,製表符,換行符等類似符號)
    • \D:非數字符號
    • .除了換行符以外的任意符號
  3. 量詞
    • n+:匹配任何包含至少一個n的字符串。
    • n*:匹配任何包含另個或多個n的字符串。
    • n?:匹配任何包含另個或一個n的字符串。

6 使用RegExp對象

6.1 test方法

test方法用於檢測一個字符串是否匹配某個模式,返回boolean類型數據。

/abc/.test("abcde");

6.2 exec方法

exec方法用於檢索字符串中的正則表達式的匹配,返回一個數組,存放匹配的結果。如果未找到匹配則爲null。

var match = /\d+/.exec("20 one two 100");
console.log(match);    //["100"]
console.log(match.index);   //8

match: Array={
    0:"20"
    index:0
    input:"20 one two 100"
    length:1
}

疑問
爲什麼沒有將所有所匹配結果都放在數組中?遇到第一個匹配就返回了?

7 匹配字符集

因此我們可以用快捷寫法寫日期的驗證,如2017-03-09 10:24:08可以寫成:

var dateReg = /\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d/;

這也太tm長了!呆會我們再換個方式處理。

我們可以將反斜槓代碼用在方括號中,如[\d.]匹配任意數字或者一個句號。但是句號會使它失去特殊含義,因爲.表示除了換行符意外任意符號,而原模式想匹配的是[任意數字.]。有些其他字符也會出現這種問題,比如+。
遇到這種問題,我們可以在方括號後添加脫字符(^)來排除某個字符集,即表示不匹配這組字符中的任何字符,也可以理解成非:

var notBinary = /[^01]/;    //非(0或1)
console.log(notBinary.test("110010010010100"));    //false 
console.log(notBinary.test("11001010110001102"));  //true 因爲除0、1外 有2可以匹配。

8 部分模式重複

匹配一個整數(一個活多個數字的序列):
在正則表達式某個元素後面添加一個加號(+),表示該元素至少重複一次。因此/\d+/可以匹配一個或多個數字字符。

console.log(/'\d+'/.test("'123'"));    //true
console.log(/'\d+'/.test("''");        //false
console.log(/'\d*'/.test("'123'");     //true
console.log(/'\d*'/.test("''"));       //true

 星號(*)有的含義與加號類似,但是可以匹配模式不存在的情況。在正則表達式的元素後添加星號並不會導致正則表達式停止匹配該元素後面的字符。只有正則表達式無法找到可以匹配的文本時菜考慮匹配該元素從未出現的情況。
 元素後面跟一個問號表示這部分模式”可選”,即模式可能出現0次或1次。

//匹配neighbour(u出現1次),也可以匹配neighbor(u沒有出現)。
var neighbor = /neighbou?r/;
console.log(neighbor.test("neighbour"));    //true
console.log(neighbor.test("neighbor"));     //true

 跨括號({ })準確指明某個模式的出現次數。
1. /\d{4}/:表示數字只能出現4次
2. /\d{2,4}/:表示數字至少出現2次,最多出現4次。
3. /\d{ ,4}/:花括號可以省略任意一側的數字,表示至多、至少的意思。

9 子表達式分組

 如果想一次性對多個元素使用*或者+,那麼你需要使用圓括號將這些元素包圍起來,創建一個分組。這些操作符會將包圍在括號中的那部分正則表達式當作一個整體處理。

var reg = /boo+(hoo+)+/i;
console.log(reg.test("Boohoooohoohooo"));    //true 

兩個+字符分別作用於boo和hoo的o字符,而第三個+字符則作用於整個元組(hoo+),可以匹配hoo+這種正則表達式出現一次及一次以上的情況。

 上述表達式末尾的i表示正則表達式不區分大小寫,雖然模式中使用小寫字母。

10 匹配和分組

 test方法是匹配正則表達式最簡單的方法,該方法只負責判斷字符串是否與某個模式匹配。
 正則表達式還有一個exec方法,如果無法匹配模式則返回null,否則返回一個表示匹配字符串信息的對象。

var match = /\d+/.exec("one two 100");
console.log(match);    //["100"]
console.log(match.index);   //8

exec方法返回的對象包含Index屬性,表示字符串成功匹配的起始位置。除此之外,該對象是一個字符串數組,其首元素是與模式匹配的字符串。

 字符串也有一個類似的match方法:

console.log("one two 100".match(/\d+/));    //["100"]

 若正則表達式包含使用圓括號保衛的子表達式分組,與這些分組匹配的文本也會出現在數組中。第一個元素是與整個模式匹配的字符串,其後是與第一個分組匹配的部分字符串(表達式中第一次出現在左圓括號的那部分),然後是第二個分組。

var quotedText = /'([^']*)'/;
console.log(quotedText.exec("she said 'hello'"));   ["'hello'", "hello"]

11 常用正則表達式

11.1 字符串中的重複字符

/(.).*\1/g

12 更多

更多內容請移步W3C http://www.w3cschool.cn/jsref/jsref-obj-regexp.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章