JS基礎:正則表達式

簡介javascript

  正則表達式 (regular expression) 描述了一種字符串匹配的模式,能夠用來檢查一個字符串是否含有某種子串、將匹配的子串作替換或者從某個字符串中取出符合某個條件的子串等。在 JS 中,RegExp 對象和 String 對象的一些方法,如:"search()"、"match()"、"replace()" 等都支持正則表達式。java

正則表達式的建立方式正則表達式

  一、實例建立方式:express

var reg = new RegExp(pattern, modifiers);

  二、字面量建立方式:數組

var reg = /pattern/modifiers

pattern:正則表達式對象

modifiers:修飾符blog

修飾符主要包括:ip

i:忽略大小寫字符串

m:多行匹配,即在到達一行文本末尾時還會繼續尋常下一行中是否與正則匹配的項input

g:全局匹配,模式應用於全部字符串,而非在找到第一個匹配項時中止

  三、實例建立方式和字面量建立方式的區別:

實例建立方式能夠進行字符串拼接,而字面量建立方式不能夠,例如:

var str = 'test';
var reg1 = new RegExp(str + '123');
var reg2 = /str/;
console.log(reg1);  //輸出 /test123/    
console.log(reg2);  //輸出 /str/

實例建立方式須要進行字符串轉義,而字面量建立方式不須要,例如:

//下面兩條語句是等價的
var reg1 = new RegExp('\\d');
var reg2 = /\d/;

這是由於在字符串中 '\' 是轉義字符,須要轉義 '\',即 '\\'。

語法

  一、修飾符

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

  二、元字符

. 匹配除了換行符 '\n' 之外的任意一個字符
\w 匹配數字、字母和下劃線
\W 匹配數字、字母和下劃線以外的任意一個字符
\d 匹配數字
\D 匹配非數字
\s 匹配空白字符
\S 匹配非空白字符
\b 匹配單詞邊界
\B 匹配非單詞邊界
\0 匹配 'null' 字符
\n 匹配換行符
\f 匹配換頁符
\r 匹配回車符
\t 匹配製表符
\v 匹配垂直製表符

  三、量詞

+ 匹配 1 到多個
* 匹配 0 到多個
? 匹配 0 個或 1 個
{n} 匹配 n 個
{n,} 匹配 n 到多個
{n,m} 匹配 n 到 m 個
x$ 匹配結尾爲 x 的字符串
^x 匹配開頭爲 x 的字符串
?=x 零寬度正先行斷言,僅當子表達式 x 在字符串位置的右側匹配時才匹配
?!x 零寬度負先行斷言,僅當子表達式 x 不在字符串位置的右側匹配時才匹配
?<=x 零寬度正後發斷言,僅當子表達式 x 在字符串位置的左側匹配時才匹配
?<!x 零寬度負後發斷言,僅當子表達式 x 不在字符串位置的左側匹配時才匹配

  四、方括號與圓括號

方括號用於給定某個範圍的字符集合

[abcd] 匹配給定集合中的任何字符
[^abcd] 匹配給定集合外的任何字符
[0-9] 匹配從 0 到 9 的數字
[a-z] 匹配從 a 到 z 的字母

圓括號和計算表達式同樣,能夠提升優先級,也能夠用於分組,例如:/a?/ 匹配 0 個或 1 個 'a',/(abc)?/ 則匹配 0 個或 1個 'abc'

  五、優先級

\ :轉義符

?: 、() 、[] :圓括號和方括號等

+ 、* 、? 、{n} 、{n,} 、{n,m} :量詞限定符等

$ 、^ 以及任何元字符和字符

| :或操做

RegExp 對象的 test() 方法

RegExpObject.test(string) :用於檢測一個字符串是否匹配某個模式,若是字符串中有匹配的值返回 true ,不然返回 false,例如:

var str = 'Hello World';
var reg = /Hello/;
console.log(reg.test(str));  //輸出 true

RegExp 對象的 exec() 方法

RegExpObject.exec(string) :用於檢測一個字符串是否匹配某個模式,若是字符串中有匹配的值返回一個結果數組,不然返回 null,例如:

var str = 'Hello World';
var reg = /Hello/;
console.log(reg.exec(str));  //輸出 ["Hello", index: 0, input: "Hello World"]

此結果數組的第 0 個元素是與正則表達式匹配的文本,第 1 個元素是與第 1 個分組匹配的文本,第 2 個元素是與第 2 個分組匹配的文本,以此類推。除了數組元素和 length 屬性外 exec() 方法還返回兩個屬性:index 屬性保存的是匹配文本的第一個字符的位置,input 屬性則存放的是被檢索的字符串,例如:

var str = 'Hello World';
var reg = /Hel(lo)/;
console.log(reg.exec(str));  //輸出 ["Hello", "lo", index: 0, input: "Hello World"]

若是正則表達式使用了全局匹配修飾符 'g',那麼在使用了 exec() 方法後,RegExpObject 對象的 'lastIndex' 屬性會設置爲匹配文本的最後一個字符的下一個位置,exec() 方法會在 'lastIndex' 指定的位置開始檢索字符串,這時你須要手動反覆調用 exec() 方法來全局匹配全部符合的文本,直到 exec() 方法再也找不到符合的文本時,它將返回 null,並把 'lastIndex' 屬性重置爲 0 ,例如:

var str = 'Hello World';
var reg = /Hello/;
console.log(reg.lastIndex); //輸出 0 
 
  
var str = 'Hello World';
var reg = /Hello/g;
console.log(reg.lastIndex);  //輸出 5

String 對象的 search() 方法

String.search(regExpObject) :用於檢索與正則表達式相匹配的子字符串,若是檢索到返回匹配子字符串第一個字符的位置,不然返回 -1,例如:

var str = 'Hello World';
var reg = /hello/i;
console.log(str.search(reg));  //輸出 0 

String 對象的 replace() 方法

String.replace(regExpObject,newvalue) :用於替換與正則表達式相匹配的子字符串,返回替換後的新字符串,例如:

var str = 'Hello World';
var reg = /hello/i;
console.log(str.replace(reg,'newString'));  //輸出 newString World

String 對象的 match() 方法

String.match(regExpObject) :用於檢測一個字符串是否匹配某個模式,若是字符串中有匹配的值返回一個結果數組,不然返回 null,例如:

var str = 'Hello World';
var reg = /Hello/;
console.log(str.match(reg));  //輸出 ["Hello", index: 0, input: "Hello World"]

RegExp 對象的 exec() 方法和 String 對象的 match() 方法的區別:

一、當正則表達式沒有分組,且非全局匹配時:exec() 方法和 match() 方法執行結果相同,均返回上述結果數組

二、當正則表達式有分組,且非全局匹配時:exec() 方法和 match() 方法執行結果相同,均返回上述結果數組,此結果數組的第 0 個元素是與正則表達式匹配的文本,第 1 個元素是與第 1 個分組匹配的文本,第 2 個元素是與第 2 個分組匹配的文本,以此類推

三、當正則表達式沒有分組,且全局匹配時:exec() 方法和 match() 方法執行結果不一樣,exec() 返回上述結果數組(同非全局匹配),可是設置了 RegExpObject 對象的 'lastIndex' 屬性,此時能夠根據 'lastIndex' 屬性的值反覆調用完成全局匹配;match() 方法則直接返回一個數組,包含全部匹配的元素

四、當正則表達式有分組,且全局匹配時:exec() 方法和 match() 方法執行結果不一樣,exec() 返回上述結果數組(同非全局匹配);match() 方法則忽略分組,只保留全局匹配的元素

也就是說,在非全局匹配時,exec() 方法和 match() 方法是徹底相同的,在全局匹配時,match() 方法會忽略分組,只保留全局匹配的元素,exec() 方法則不會忽略分組,而是經過 'lastIndex' 屬性進行全局匹配

相關文章
相關標籤/搜索