1. 程式人生 > >正則表達式(Regular Expression)

正則表達式(Regular Expression)

出現 取反 出現一次 mib 不起作用 margin 英文 當前 expr

正則表達式工具:http://regexper.com

RegExp對象: 兩種方法實例化RegExp對象

.字面量(定義變量,var reg = /正則表達式文本/g 添加g表示匹配所有符合表達式的字符串,否則只匹配第一個符合表達式的字符串)

.構造函數( var reg = new RegExp(‘正則表達式文本’,’修飾符’)第二個參數可有可無,據需求而定)

修飾符(對象屬性) :

.g: global全文搜索,不添加,搜索到第一個匹配停止.

.i: ignore case 忽略大小寫,默認大小寫敏感.

.m:multiple lines 多行搜索,將換行符後的字符串當作新的字符串.

.lastIndex:是當前表達式匹配內容的最後一個字符的下一個位置(即下一個開始搜索的位置)

.source:正則表達式的文本字符串

元字符查看元字符表

字符類:

.使用元字符[ ]來構建一個簡單的類

.表達式[abc]把字符a或b或c歸為一類,表達式可以匹配這類的字符

字符類取反:

.使用元字符^創建 反向類/負向類

.表達式[^abc]表示 不是字符a或b或c的內容

範圍類

.使用[a-z]來連接兩個字符表示從a到z的任意字符

.這個是閉區間,包含了a和z本身

.在[ ]組成的類內部是可以連寫的 [a-zA-Z]

.若是在範圍內裏相匹配 -符號,直接在範圍後加上該符號即可ep: [a-z-]

預定義類:

匹配一個 ab+數字+任意字符 的字符串 ab/d.

邊界符

^: 以xxx開始

$: 以xxx結束

\b: 單詞邊界

\B: 非單詞邊界

量詞:

?:出現零次或一次(最多出現一次)

+ :出現一次或多次(至少出現一次)

*: 出現零次或多次(任意次)

{n}: 出現n次

{n,m}: 出現n到m次

{n,}: 至少出現n次

貪婪模式(默認):

給一個範圍,會盡可能多的去匹配一個字符串,ep:’12345678’.replace(/\d{3,6}/g,’p’), 會匹配到1-6,而不是1-3

非貪婪模式:

. 讓正則表達式盡可能少的去匹配,即一旦成功匹配就不再繼續嘗試

. 該模式標識,需在量詞後加上

分組:

使用()可以達到分組的功能,使量詞作用於分組

或:使用 | 可以達到或的效果

反向引用:$(1-n) 分別引用的是正則表達式中的(1-n)個分組

忽略分組:不希望捕獲某些分組,只需要在分組內加上?:就可以

(註意:以上各符號需在英文輸入法中輸入才會起作用)

. 正則表達式從文本頭部向尾部開始解析,文本尾部方向,稱為“前”

前瞻:就是在正則表達式匹配到規則的時候,向前檢查是否符合斷言

. 符合和不符合特定斷言稱為 肯定/正向 匹配和 否定/負向 匹配

正向前瞻:exp(?=assert) (斷言部分不參與匹配,只表示一個必須符合的匹配條件)

負向前瞻:exp(?!assert)

後顧/後瞻:與前瞻方向相反(JavaScript 不支持後顧)

正向後顧:exp(?<=assert) 負向後顧:exp(?<!assert)

正則表達式對象本身提供的兩個方法:

. RegExp.prototype.test(str):用於測試字符串參數中是否存在匹配正則表達式模式的字符串,如果存在則返回true,否則返回false(受lastIndex影響,有個循環過程,字符串中有多少個符合匹配的就返回多少次true,之後就返回false)

. RegEx.prototype.exec(str):使用正則表達式模式對字符串執行搜索,並將更新全局RegExp對象的屬性以反映匹配結果,如果沒有匹配的文本則返回null,否則返回一個結果數組

-index 聲明匹配文本的第一個字符的位置

-input 存放被檢索的字符串 string

. 調用非全局的RegExp對象的exec()時,返回數組,其lastIndex不起作用

第一個元素是與正則表達式相匹配的文本

第二個元素是與RegExpObject的第一個子表達式(即第一個分組)相匹配的文本(如果有的話)

第三個元素是與RegExpObject的第二個子表達式(即第二個分組)相匹配的文本(如果有的話)以此類推……

. 調用全局RegExp對象(即加了g修飾符的)的exec()時,返回多個數組

字符串對象方法:

. String.prototype.search(reg): 用於檢索字符串中指定的子字符串,或檢索與正則表達式相匹配的子字符串,方法返回第一個匹配結果index,查找不到返回-1

該方法不執行全局匹配,它將忽略標識g,並且總是從字符串的開始進行檢索

. String.prototype.match(reg):將檢索字符串,以找到一個或多個與RegExp相匹配的文本,如果沒有找到任何匹配的文本,將返回null,否則它將返回一個數組,其中存放了與它找到的匹配文本有關的信息,返回數組的內容與exec()方法返回的數組內容相同

返回的數組還含有兩個對象屬性:

. index 聲明匹配文本的起始字符在字符串的位置

. input 聲明對stringObject的引用

如果regexp沒有標誌g,那麽match方法只能在字符串中執行一次匹配

如果有標誌g,全局調用,找到字符串中的所有匹配子字符串,若沒找到返回null,若找到了一個或多個匹配子串,則返回一個數組,數組元素中存放的是字符串中所有的匹配子串,而且也沒有index屬性或input屬性

. String.prototype.split(reg): 常用這個方法把字符串分割為字符數組

ep: ‘a,b,c,d’.split(‘,’); — [“a”,”b”,”c”,”d”]

在一些復雜的分割情況下可以使用正則表達式解決

ep: ‘a1b2c3d’.split(/\d/);— [“a”,”b”,”c”,”d”]

. String.prototype.replace( str/reg, replaceStr/function(1.匹配字符串match,2.正則表達式的分組內容group…,沒有則就沒有該參數,3.匹配項在字符串中的index,4.原字符串origin))

正則表達式(Regular Expression)