正則表達式(Regular Expression)
正則表達式工具: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)