歡迎使用CSDN markdown編輯器

2021-08-03 22:12:39 字數 4577 閱讀 6410

適用場景:

正規表示式物件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頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...