正則表達式

正則表達式

MDN文檔

名詞解析

1. 斷言
斷言,就是指明某個字符串前邊或者後邊,將會出現滿足某種規律的字符串。

零寬斷言:一般的正則表達式匹配,都是有 寬度 的,如:w+。 會將 '。' 一同匹配到。如果像 '。' 這樣的內容只是一種判斷條件,即不想被正則匹配到,就要使用到 零寬斷言了。

(?=X)零寬度正先行斷言:僅當子表達式 X 在 此位置的右側匹配時才繼續匹配。例如,w+(?=d) 與後跟數字的單詞匹配,而不與該數字匹配。此構造不會回溯。
(?!X)零寬度負先行斷言:僅當子表達式 X 不在 此位置的右側匹配時才繼續匹配。例如,例如,w+(?!d) 與後不跟數字的單詞匹配,而不與該數字匹配 。
(?<=X)零寬度正後發斷言:僅當子表達式 X 在 此位置的左側匹配時才繼續匹配。例如,(?<=19)99 與跟在 19 後面的 99 的實例匹配。此構造不會回溯。
(?<!X)零寬度負後發斷言:僅當子表達式 X 不在此位置的左側匹配時才繼續匹配。例如,(?<!19)99 與不跟在 19 後面的 99 的實例匹配

目前JS只支持先行斷言,後發斷言還不支持。不過目前chrome支持了後發斷言。

2. 分組

分組的類型(四種):

捕獲型   - ()

非捕獲型  - (?:)

正向前瞻型 - (?=)

反向前瞻型 - (?!)

其中只有捕獲型分組會暫存匹配到的串。

一個分組中可以寫多個表達式:(表達式1|表達式2|表達式3), 表示匹配其中任意一個表達式。
分組可以通過將某些表達式組合成整體,這樣可以簡化表達式的書寫。例如將/testtesttest/寫爲/(test){3}/

3. 捕獲與引用

1) 嵌套分組的捕獲: 規則是以左括號出現的順序進行捕獲
<pre>
var reg = /((kid) is (a (doubi)))/
var str = "kid is a doubi"

reg.test( str ) // true

console.log(RegExp.$1) // kid is a doubi
console.log(RegExp.$2) // kid
console.log(RegExp.$3) // a doubi
console.log(RegExp.$4) // doubi
</pre>

通過 $1 可以引用捕獲的字符串

2) replace中捕獲的使用:

image.png

3) 反向引用

正則表達式裏也能進行引用,這稱爲反向引用:
<pre>
var reg = /(w{3}) is 1/

reg.test('kid is kid') // true
reg.test('dik is dik') // true
reg.test('kid is dik') // false
reg.test('dik is kid') // false
</pre>

1引用了第一個被分組所捕獲的串,換言之,表達式是動態決定的。

注意,如果編號越界了,則會被當成普通的表達式:

<pre>
var reg = /(w{3}) is 6/;

reg.test( 'kid is kid' ); // false
reg.test( 'kid is 6' ); // true
</pre>

3. 字符集合

通常字符集合有由[]方括號括起來。
image.png

方法

exec、test、match、replace
segmentfault文章

replace默認只替換第一個匹配到的字符串。
mdn文檔RegExp對象

  • JavaScript exec() 方法

RegExpObject.exec(string)
exec() 方法用於檢索字符串中的正則表達式的匹配,返回一個數組,其中存放匹配的結果。如果未找到匹配,則返回值爲 null;
情況 1)RegExp爲非全局正則表達式;
情況 2)RegExp爲全局正則表達式,exec()可以像迭代器那樣,多次調用,獲得匹配值;

  • JavaScript test() 方法

RegExpObject.test(string)
如果字符串 string 中含有與 RegExpObject 匹配的文本,則返回 true,否則返回 false

  • String.prototype.replace()方法

W3 replace方法
MDN replace方法

正則相關屬性和方法

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