JavaScript對象之--- RegExp

一、概述

正則表達式是描述字符模式的對象。html

正則表達式用於對字符串模式匹配以及檢索替換;正則表達式

 

二、語法

前者爲模式,後者爲修飾符。數組

var reg = new RegExp( "xyz", "i" );
//等價於
var reg = /xyz/i;

注意:當使用構造函數建立正則對象的時候,須要在元字符前面加反斜槓(\)函數

var reg = new RegExp("\\w+");
//等價於
var reg = /\w+/;

 

三、修飾符

i ---- 不區分大小寫
g ---- 全局匹配
m ---  多行匹配

 

m修飾符的做用:修改^和$在正則表達式中的做用,讓它們分別表示行首和行尾。grunt

        在默認狀態下,一個字符串不管是否換行只有一個開始^和結尾$,若是採用多行匹配,那麼每個行都有一個^和結尾$。 this

var str="This is an\n antzone good"; 
var reg=/an$/;
console.log(str.match(reg)); // false       沒有采用多行匹配,an不是字符串行的行尾。
var str="This is an\n antzone good"; 
var reg=/an$/m;
console.log(str.match(reg)); // true

 

四、方括號

方括號用於查找某個範圍內的字符。spa

[0-9]    查找從0到9的任意數字
[a-z]    查找從a到z的任意字符
[A-Z]    查找從A到Z的任意字符
[A-z]    查找從A到z的任意字符
[adgk]    查找給定集合內的任意字符
[^adgk]   查找非給定集合內任意字符
( red | blue | green ) 查找任意指定的選項

 

五、元字符

擁有特殊含義的字符code

.          任意單個字符(除換行符之外)
\w         單詞字符
\W         非單詞字符
\d         數字字符
\D         非數字字符
\s         空白字符
\S         非空白字符
\n         換行
\r         回車

 

六、量詞

n+                匹配任何包含至少一個 n 的字符串 
              --- 例如,/a+/ 匹配 "candy" 中的 "a","caaaaaaandy" 中全部的 "a"。
n
* 匹配任何包含零個或多個 n 的字符串
              --- 例如,/bo*/ 匹配 "A ghost booooed" 中的 "boooo","A bird warbled" 中的 "b",可是不匹配 "A goat grunted"。
n
? 匹配任何包含零個或一個 n 的字符串
              --- 例如,/e?le?/ 匹配 "angel" 中的 "el","angle" 中的 "le"。
n{x} 匹配包含 X 個 n 的序列的字符串
              --- 例如,/a{2}/ 不匹配 "candy," 中的 "a",可是匹配 "caandy," 中的兩個 "a",且匹配 "caaandy." 中的前兩個 "a"
n{x,}        X 是一個正整數。前面的模式 n 連續出現至少 X 次時匹配。
              -- 例如,/a{2,}/ 不匹配 "candy" 中的 "a",可是匹配 "caandy" 和 "caaaaaaandy." 中全部的 "a"。
n{x,y}        X 和 Y 爲正整數。前面的模式 n 連續出現至少 X 次,至多 Y 次時匹配。
              --- 例如,/a{1,3}/ 不匹配 "cndy";匹配 "candy," 中的 "a";"caandy," 中的兩個 "a";匹配 "caaaaaaandy" 中的前面三個 "a"。
                 注意,當匹配 "caaaaaaandy" 時,即便原始字符串擁有更多的 "a",匹配項也是 "aaa"。
n$        匹配任何結尾爲 n 的字符串。
^n         匹配任何結尾爲 n 的字符串。
?=n         匹配任何其後緊跟指定字符串n的字符串
?!n        
匹配任何其後沒有緊跟指定字符串n的字符串
 

 

七、RegExp 對象的方法

(1)compile方法  --  【str.compile(pattern)】

compile() 方法用於在腳本執行過程當中編譯正則表達式。也可用於改變和從新編譯正則表達式。regexp

//在字符串中全局搜索 "man",並用 "person" 替換。而後經過 compile() 方法,改變正則表達式,用 "person" 替換 "man" 或 "woman",
<script>

var str="Every man in the world! Every woman on earth!";
var patt=/man/g;
var str2=str.replace(patt,"person");
document.write(str2+"<br>");  //Every person in the world! Every woperson on earth!
patt
=/(wo)?man/g; patt.compile(patt); str2=str.replace(patt,"person"); document.write(str2);      //Every person in the world! Every person on earth! </script>

 

(2)exec方法  --  【pattern.exec(str)】

exec() 方法用於檢索字符串中的正則表達式的匹配。若是字符串中有匹配的值則返回該值,不然就返回null。htm

var str="Hello world!";
//查找"Hello"
var patt=/Hello/g;
var result = patt.exec(str);
document.write("返回值: " +  result);    // 返回值:Hello
//查找 "RUNOOB"
patt=/RUNOOB/g;
result=patt.exec(str);
document.write("<br>返回值: " +  result);  //返回值: null

 

(3)test方法  --  【pattern.test(str)】

test() 方法用於檢測一個字符串是否匹配某個模式。若是字符串有匹配的值返回true,不然返回false。

var str="Hello world!";
//查找"Hello" var patt=/Hello/g; var result=patt.test(str); document.write("返回值: " + result);     //返回值:true
//查找 "Runoob" patt=/Runoob/g; result=patt.test(str); document.write("<br>返回值: " + result);  //返回值false

 

八、string對象中 可用於正則表達式的方法。

(1)search方法

search() 方法用於檢索字符串中指定的子字符串,或檢索與正則表達式相匹配的子字符串。若沒有找到任何匹配的子串,返回-1

//對大小寫敏感的檢索
var
str="Mr. Blue has a blue house"; document.write(str.search("blue"));  // 15
//忽略大小寫的檢索
var
str="Mr. Blue has a blue house"; document.write(str.search(/blue/i)); //4

 

(2)match方法

match() 方法可在字符串內檢索指定的值,或找到一個或多個正則表達式的匹配。

若regexp沒有標誌g,則match方法就只能在字符串中執行一次;不然就會執行屢次。若沒有找到任何匹配文本,返回null;不然返回一個存放了匹配文本信息的數組

var str="The rain in SPAIN stays mainly in the plain"; 
var n=str.match(/ain/gi);    //["ain", "AIN", "ain", "ain"]

 

(3)replace方法

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

var str="Mr Blue has a blue house and a blue car";
var n=str.replace(/blue/gi, "red");    
console.log(str);   // Mr red has a red house and a red car

 

(4)split方法

split() 方法用於把一個字符串分割成字符串數組。

注意:split 方法不會改變原始字符串。

var str="How are you doing today?";
var n=str.split();    //["How are you doing today?"]
var str="How are you doing today?";
var n=str.split();   //["H", "o", "w", " ", "a", "r", "e", " ", "y", "o", "u", " ", "d", "o", "i", "n", "g", " ", "t", "o", "d", "a", "y", "?"]
var str="How are you doing today?";
var n=str.split(" ",3);  //["How", "are", "you"]

 


 

 

九、正則的一些 demo

(1)匹配編號爲任意位數的章節標題:

/Chapter [1-9][0-9]*/    // 第二個位置 或 後面的位置 不必定須要有一個數字。

 

(2)若章節編號被限制爲最多隻有 99 章:

/Chapter [0-9]{1,2}/    // 缺陷: 0也會被匹配

// 改進
/Chapter [1-9][0-9]?/  或者    /Chapter [1-9][0-9]{0,1}/

 

(3)*、+ 限定符都是貪婪的,由於它們會盡量多的匹配文字,只有在它們的後面加上一個?就能夠實現非貪婪或最小匹配。

<H1>Chapter 1 - 介紹正則表達式</H1>
貪婪:下面的表達式匹配從開始小於符號 (<) 到關閉 H1 標記的大於符號 (>) 之間的全部內容。 /<.*>/

非貪婪:若是您只須要匹配開始和結束 H1 標籤,下面的非貪婪表達式只匹配 <H1>/<.*?>/

若是隻想匹配開始的 H1 標籤,表達式則是: /<\w+?>/

 

(4)反向引用的例子

對一個正則表達式模式或部分模式兩邊添加圓括號將致使相關匹配存儲到一個臨時緩衝區中,所捕獲的每一個子匹配都按照在正則表達式模式中從左到右出現的順序存儲。

緩衝區編號從 1 開始,最多可存儲 99 個捕獲的子表達式。每一個緩衝區均可以使用  \n 訪問,其中 n 爲一個標識特定緩衝區的一位或兩位十進制數。

可使用非捕獲元字符 ?:、?= 或 ?! 來重寫捕獲,忽略對相關匹配的保存。

 

反向引用的最簡單的、最有用的應用之一,是提供查找文本中兩個相同的相鄰單詞的匹配項的能力。如下面的句子爲例:

var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/ig; document.write(str.match(patt1));

捕獲的表達式,正如 [a-z]+ 指定的,包括一個或多個字母。正則表達式的第二部分是對之前捕獲的子匹配項的引用,即,單詞的第二個匹配項正好由括號表達式匹配。\1 指定第一個子匹配項。

字邊界元字符確保只檢測整個單詞。不然,諸如 "is issued" 或 "this is" 之類的詞組將不能正確地被此表達式識別。

正則表達式後面的全局標記 g 指定將該表達式應用到輸入字符串中可以查找到的儘量多的匹配。

表達式的結尾處的不區分大小寫 i 標記指定不區分大小寫。

 

 

反向引用還能夠將通用資源指示符 (URI) 分解爲 協議、域名、端口 和 路徑:

var str = "http://www.runoob.com:80/html/html-tutorial.html";
var patt1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/;    // 中括號[] 裏面的^ 表示的是「非」的意思 arr = str.match(patt1); for (var i = 0; i < arr.length ; i++) { document.write(arr[i]); document.write("<br>"); }

第一個括號子表達式捕獲 Web 地址的協議部分。該子表達式匹配在冒號和兩個正斜槓前面的任何單詞。 —— "http"

第二個括號子表達式捕獲地址的域名部分。子表達式匹配 : 和 / 以後的一個或多個字符。—— "www.runoob.com"

第三個括號子表達式捕獲端口號(若是指定了的話)。該子表達式匹配冒號後面的零個或多個數字。只能重複一次該子表達式。—— ":80"

第四個括號子表達式捕獲 Web 地址指定的路徑和 / 或頁信息。該子表達式能匹配不包括 # 或空格字符的任何字符序列。—— "/html/html-tutorial.html"

相關文章
相關標籤/搜索