以前寫正則都是各類上網搜索,仍是沒有系統的學習過正則表達式的用法,今天稍稍研究了一下下,感受仍是收穫頗豐的,分享給各位,但願對於大家有所幫助~~正則表達式
g
--全局匹配i
--不區分大小寫,默認區分m
--多行搜索\d
: 數字;[0-9]
\D
: 非數字字符;[^0-9]
\s
: 空白符;[\t\n\x0B\f\r]
\S
: 非空白符;[^\t\n\x0B\f\r]
\w
: 單詞字符(字母,數字,下劃線);[a-zA-Z_0-9]
\W
: 非單詞字符;[^a-zA-Z_0-9]
[]
: 表示字符類 []
中的^
表示取反,-
表示範圍如:[0-9][a-z]
;?
: 出現0次或者1次(最多出現一次);+
: 出現1次或者屢次(最少出現1次);*
: 出現0次或者屢次(任意次);{n}
: 出現n次;{n,m}
: 出現n到m次{n,}
: 至少出現n次;^
: 以xxxx開始;$
: 以xxxx結尾;\b
: 單詞邊界;\B
: 非單詞邊界;如\d{3,6}
匹配3-6個數字,那麼 "12345678"就會匹配\d{6}
數組
在量詞後面加上?就會盡量少的匹配了,上面的例子\d{3,6}?
就會匹配\d{3}
了學習
想要匹配abc重複三次的場景,abc{3}
不就好了?事實上abc{3}
匹配的是c{3},若想匹配abc3次則須要用到分組的概念了;
正則中()表示分組,及(abc){3}
爲匹配 abc 3次
$n表明匹配的分組
如:2018-03-03匹配換成2018年03月03日?測試
"2018-03-01".replace(/(\d{4})-(\d{2})-(\d{2})/g,"$1年$2月$3日");
分組中不想被匹配到的分組在分組中加上?:
就能夠了,如上例:prototype
"2018-03-01".replace(/(\d{4})-(?:\d{2})-(\d{2})/g,"$1年$2月$3日");
這時第二個分組就不會被捕獲,就至關於有兩個分組,因此不存在$3
這時的輸出結果就會是 "2018年01月$3日";
code
aaa | bbb 兩個同時匹配對象
前瞻就是在正則表達式匹配到規則的時候,向前檢查是否符合斷言("前"的概念就是正則表達式從文本頭部向尾部開始解析)
Javascript 不支持後顧因此這裏就不作過多研究了哈。
-符合特定斷言爲 確定/正向 匹配
正向前瞻:exp(?=assert)
例子:ip
"s3&df34a7".replace(/\w(?=\d)/g,'OK');
會輸出 "OK3&dOKOK4OK7"
即找到匹配的單詞(w)後會再次匹配後面的字符是否是數字,若是是則當前匹配的字符替換爲OK,本次替換的單詞(w)是s,f,3,a字符串
-不符合特定斷言爲 否認/負向 匹配
負向前瞻:exp(?!assert)
栗子:get
"s3&df34a7".replace(/\w(?=\d)/g,'OK');
會輸出 "sOK&OKf3OKaOK"
即找到匹配的單詞(w)後會再次匹配後面的字符是否是數字,若是不是則當前匹配的字符替換爲OK,本次替換的單詞(w)是3,d,4,7。把7算進來我認爲是匹配到7的時候後面沒有字符了是空也不是數字因此被替換了,若是不對還請大神指正哈。
global
是否全文搜索,默認爲false
,修飾符中的g;ignoreCase
是否大小寫敏感,默認爲false
,修飾符中的i;multiline
多行搜索,默認爲false
,修飾符中的m;lastIndex
是當前表達式匹配內容的最後一個字符的下一個位置(有點繞哈,後面會解釋);source
正則表達式的文本字符串;舉個栗子:
var reg = /\w/gim; reg.global // true reg.ignoreCase //true reg.source // "\w"
RegExp.prototype.test(str)
用於測試字符串參數中是否存在匹配正則表達式模式的字符串,若是存在則返回true
,不然返回false
;舉個栗子:
var reg1 = /\w/; reg1.test('a'); // true reg1.test('#'); // false reg1.test('a'); // true reg1.test('#'); // false
再舉個栗子:
var reg2 = /\w/g; reg2.test('a'); // true reg2.test('#'); // false reg2.test('a'); // false reg2.test('a'); // true reg2.test('a'); // false
看到區別了麼?當全局檢索時爲何第二次執行reg2.test('a');
時返回false
呢?如今就要說說上文提到的對象屬性lastIndex
啦,沒記住的回到上面看看定義,當第一次執行時咱們獲取到的lastIndex
是1,那下一次就會從2的位置開始執行,而咱們能夠知道2的位置是沒有字符的,因此返回false
,第三次執行的時候有返回了true
是由於查詢到沒有字符了lastIndex
又重置了。一樣的你也能夠測試reg2.test('aaa')
第四次執行的時候就會是false了,須要知道的是,只有在全局檢索時(g)lastIndex
纔會生效,不然的話只會返回 0 哦
RegExp.prototype.exec(str)
使用正則表達式模式對字符串執行搜索,並將更新全局RegExp
對象的屬性以反映匹配結果。若是沒有匹配的文本則返回null
,不然返回一個數組:
index
聲明匹配文本的第一個字符的位置;input
存放被檢索字符串的string
;調用非全局的RegExp
對象的exec()
方法時,返回數組
RegExp
對象的第一個子表達式(上文中的分組)相匹配的文本(若是有的話)RegExp
對象的第二個子表達式(上文中的分組)相匹配的文本(若是有的話),以此類推舉個栗子:
var reg = /\d(\w)(\w)\d/; var text = '1az2bc3cf4df5gf'; var regexec = reg.exec(text); console.log(reg.lastIndex + '\t' + regexec.index + '\t' + regexec.toString()); //0 0 1az2,a,z
由於是非全局調用因此reg.lastIndex
返回 0;regexec.index
返回了0,匹配到的文本的第一個字符是"1",index也就是0,regexec
返回的數組第一元素是與reg
相匹配的文本,第二個元素是該文本中的符合正則表達式中第一個分組(w)的文本是"a"
後面的z同理。
再來看看全局調用的例子
var reg = /\d(\w)(\w)\d/g; var text = '1az2bc3cf4df5gf'; while(regexec = reg.exec(text)){ console.log(reg.lastIndex + '\t' + regexec.index + '\t' + regexec.toString()); } // 4 0 1az2,a,z // 10 6 3cf4,c,f
全局調用 lastIndex
生效 分別讀取到1az2
和3cf4
的下一個字符的位置,後面與非全局調用同理,不過全局調用返回的是整段字符串符合規則的文本。
嗯哼,這篇文章就到這裏了,若是對你有所幫助點個贊啦貓大在此謝過啦
本文會在我的博客更新的哦,博主可好了,有空溜達溜達~~~