正規表示式之補獲性分組與非補獲性分組

2022-09-08 16:45:16 字數 2788 閱讀 5832

捕獲性分組

j**ascript中捕獲性分組是以小括號()來實現,捕獲性分組工作模式()會把每個分組裡匹配的值儲存起來。

比如利用捕獲性分組把 hello world 互換成 world hello:

方法一:通過exec函式

var str = 'hello world';            //

首先建立好字串

var pattern = /([a-z]+)\s([a-z]+)/; //

先通過正則匹配這個字串,用分組模式來獲取這兩個單詞

var arr = pattern.exec(str); //

exec方法返回的是乙個陣列,包含匹配到的字串以及分組(也稱子串)裡的值

console.log(arr);

//['hello world','hello','world']

console.log(arr[0]); //

'hello world' 匹配到的字串

console.log(arr[1]); //

'hello' 第乙個分組([a-z]+)的值

console.log(arr[2]); //

'world' 第二個分組([a-z]+)的值

//這時候兩個分組的值都得到了,接下來用字串拼接法實現互換

var n_str = arr[2]+' '+arr[1];

console.log(n_str)

//world hello

方法二:通過屬性$1-9

var str = 'hello world';            

var pattern = /([a-z]+)\s([a-z]+)/;

pattern.test(str);

//這個地方必須執行正則匹配一次,方式不限,可以是test()、exec()、以及string的正則方式

console.log(regexp.$1) //

'hello' 第乙個分組([a-z]+)的值

console.log(regexp.$2) //

'world' 第二個分組([a-z]+)的值

var n_str = regexp.$2+' '+regexp.$1;

console.log(n_str)

//world hello

方法三:通過string的replace()

var str = 'hello world'; 

var pattern = /([a-z]+)\s([a-z]+)/;

var n_str = str.replace(pattern,"$2 $1"); //

這裡的$1、$2與方法二里的regexp.$1、regexp.$2作用是相同的。

console.log(n_str) //

world hello

非捕獲性分組:(?:

非捕獲性分組工作模式下分組(?:)會作為匹配校驗,並出現在匹配結果字元裡面,但不作為子匹配返回。

比如利用非捕獲性分組獲取字串000aaa111,而且只返回乙個值為aaa111的陣列:

//

先看用捕獲性分組匹配會返回什麼

var str1 = '000aaa111';

var pattern = /([a-z]+)(\d+)/; //

捕獲性分組匹配

var arr =pattern.exec(str1);

console.log(arr)

//['aaa111','aaa','111'] 結果子串也獲取到了,這並不是我們想要的結果

//非捕獲性分組

var str2 = '000aaa111';

var pattern2 = /(?:[a-z]+)(?:\d+)/; //

非捕獲性分組匹配

var arr2 =pattern.exec(str2);

console.log(arr2)

//['aaa111'] 結果正確

前瞻:(?=)和(?!)

前瞻分為正向前瞻和反(負)向前瞻,正向前瞻(?=表示式)表示後面要有什麼,反向前瞻(?!表示式)表示後面不能有什麼。

前瞻分組會作為匹配校驗,但不出現在匹配結果字元裡面,而且不作為子匹配返回。

//

正向前瞻,匹配.jpg字尾檔名

正向前瞻匹配

console.log(str.match(partern)); //

['123', 'abc'] 返回結果正確,沒有匹配456.gif

反向前瞻匹配一批字母加數字:

//

反向前瞻,匹配3個及以上的a,而且後面不能有000的字元

var str = 'aaa000 aaaa111 aaaaaaa222';

var partern = /a(?!000)/g; //

反向前瞻匹配

console.log(str.match(partern)); //

['aaaa', 'aaaaaaa'] 返回結果正確,沒有匹配aaa000

前瞻,可以放在位置不固定,可前匹配和後匹配,如:/(?=.jpg)\w+/g;

其他

正規表示式 非捕獲分組

目前為止,總共介紹了括號的三種用途 分組,將相關的語速歸攏到一起,構成單個元素 多選結構,規定可能出現的多個子表達示 引用分組,將子表示式匹配的文字儲存起來,供之後引用。這三種用途並不是彼此獨立的,而是互相重疊的 單純的分組可以視為 只包含乙個多選分支的多選結構 整個多選結構也會被視為單個元素,可以...

正規表示式之捕獲型分組與非捕獲型分組

使用小括號指定乙個子表示式後,匹配這個子表示式的文字 也就是此分組捕獲的內容 可以在表示式或其它程式中作進一步的處理。捕獲組 語法 字元 描述 示例 pattern 匹配pattern並捕獲結果,自動設定組號。abc d 匹配abcd或者abcabcd pattern 或 name pattern ...

正規表示式 分組與引用

分組 捕獲匹配的子字串。使用 的捕獲根據左括號的順序從 1 開始自動編號。捕獲元素編號為零的第乙個捕獲是由整個正規表示式模式匹配的文字。比如 d d是乙個簡單的ip位址匹配表示式。要理解這個表示式,請按下列順序分析它 d匹配1到3位的數字,d 匹配三位數字加上乙個英文句號 這個整體也就是這個分組 重...