適用場景:
正規表示式物件regexp:exec()/test()
字串string:match()/search()/split()/replace()
建立正規表示式
正規表示式字面量:/abc/gim
正規表示式物件 :new regexp('abc', 'gim')
使用字面量和正則建構函式建立的區別: 字面量是編譯時處理,使用建構函式則是在執行時處理。因此字面量有更好的效能,建構函式適用於正則模式可能會改變或者是由使用者輸入的情況。
特殊字元
^
匹配輸入的開始。在字符集中的起始位置則表示 非
$
匹配輸入的結束
*
匹配前乙個表示式0次或多次,等價於+
匹配前乙個表示式1次或多次,等價於?
匹配前乙個表示式0次或1次,等價於.
匹配除換行符之外的所有單個字元
(x)
匹配』x』並記住,括號也稱作捕獲括號,在正規表示式的匹配環節用\1 \2 \n
來訪問,在正則的替換環節(通常是字串的replace()函式中)用$1 $2 $n
來訪問
(?:x)
匹配但不記住』x』,也叫做非捕獲括號
x(?=y)
匹配x僅當x後面緊跟著y
x(?!y)
匹配x僅當x後面沒有緊跟著y
x|y
匹配x或y
匹配前乙個字元正好出現n次
匹配前乙個字元出現次數》= n <=m
[xyz]
字元集合,匹配方括號中的任意字元
[^xyz]
反向字符集,匹配沒有包含在方括號中的任意字元
\b
匹配乙個詞的邊界
\b
匹配乙個非單詞邊界
\d
匹配乙個數字
\d
匹配乙個非數字字元
\s
匹配乙個空白字元,包括空格、換行符、製表符、換頁符
\s
匹配乙個非空白字元
\w
匹配乙個單字字元(數字字母下劃線),等價於[a-za-z0-9_]
\w
匹配乙個非單字字元(數字字母下劃線),等價於[^a-za-z0-9_]
四個可選引數:可以任意順序組合
g 全域性匹配
i 不區分大小寫
m 多行搜尋
y 執行「粘性」搜尋,匹配從目標字串的當前位置開始,可以使用y標誌。
函式詳解
regexp的exec()
首先要注意如果使用乙個未分配給乙個變數的正規表示式,那麼隨後將不能訪問這個正規表示式執行結果後的屬性。例如:
/a/g.exec('abca')
// ["a", index: 0, input: "abca"]
/a/g.lastindex
// 0
// 如果要訪問正則的執行後的屬性,應該把它先賦值給乙個變數
var r = /a/g;
// undefined
r.exec('abca')
// ["a", index: 0, input: "abca"]
r.lastindex
// 1
r.exec('abca')
// ["a", index: 3, input: "abca"]
r.lastindex
// 4
exec 執行後如果匹配失敗會返回null
,如果匹配成功,exec() 方法返回乙個陣列,並更新正規表示式物件的屬性。返回的陣列將完全匹配成功的文字作為第一項,將正則括號裡匹配成功的作為陣列填充到後面。陣列中的返回字段如下圖。array中有三個元素,第乙個array[0]是匹配到的子串,array[1]到array[n]是括號中捕獲到的分組,array[『index』]是匹配到的索引,array[『input』]是初始字串。執行後正規表示式變數的兩個屬性是lastindex和source,表示下一次匹配的開始索引,正規表示式的模式文字。
注意exec執行正則時有無g
全域性匹配的標識的不同。沒有g每次只匹配第乙個就返回了,lastindex置為0,下次繼續從頭開始匹配。有g每次會記錄lastindex的位置,當執行到最後乙個匹配後會返回null標識最後乙個匹配到結尾沒有匹配到,然後lastindex置0再次從頭開始匹配。
var r = /a/
// undefined
r.exec('abca')
// ["a", index: 0, input: "abca"]
r.lastindex
// 0
r.exec('abca')
// ["a", index: 0, input: "abca"]
r.lastindex
// 0
var r2 = /a/g
// undefined
r2.exec('abca')
// ["a", index: 0, input: "abca"]
r2// /a/g
r2.lastindex
// 1
r2.exec('abca')
// ["a", index: 3, input: "abca"]
r2.lastindex
// 4
r2.exec('abca')
// null
r2.lastindex
// 0
r2.exec('abca')
// ["a", index: 0, input: "abca"]
r2.lastindex
// 1
利用exec()如何找到全部的匹配呢?只能迴圈:
var r = /a/g;
var str = 'aba';
var array = ;
while ((array = r.exec(str)) !== null)
regexp的test()
匹配成功返回true,失敗返回false,要注意有全域性標識g的時候與exec類似,其lastindex不斷變化的問題
var r = /a/g;
// undefined
r.test('aba')
true
r.lastindex
// 1
r.test('aba')
true
r.lastindex
// 3
r.test('aba')
false
r.lastindex
// 0
r.test('aba')
// true
r.lastindex
// 1
string的match()
成功匹配則返回值array是乙個包含了整個匹配結果以及任何括號捕獲的匹配結果的 array ;如果沒有匹配項,則返回 null。
注意match匹配時正規表示式是否有 全域性搜尋標誌g 的情況是完全不同的。
沒有g,match()和regexp的exec()方法完全相同。array[0]為完全匹配的元素,array[1]至array[n]是捕獲的子匹配。此外還有array[index] 和 array[input]
有g,則該方法返回乙個 array ,它包含所有匹配的子字串而不是匹配物件。捕獲組不會被返回(即不返回index屬性和input屬性)。如果沒有匹配到,則返回 null
例如:
'aacbc'.match(/(a*)c/g)
// (2) ["aac", "c"]
'aacbc'.match(/(a*)c/)
// (2) ["aac", "aa", index: 0, input: "aacbc"]
string的search()
與regexp的test()類似,不過找到了返回下標,沒找到返回-1
string的split()
split引數接受字串或者正規表示式,返回陣列
string的replace()
替換的時候可以用1/
2/$n 獲取到捕獲的子串,如:
var r = /(\w*)\s(\w*)/;
var s = 'abc def';
s.replace(r, '$2, $1');
// "def , abc"
mdn 正規表示式
mdn exec()方法
mdn match()方法
歡迎使用CSDN markdow
本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...
歡迎毛毛與妞妞使用CSDN markdown編輯器
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...
歡迎使用CSDN markdow1n編輯器
本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...