摘要:正則表達式一直是里比較難以掌握的點。在中創建正則的兩種方式使用字面量這就是正則表達式的字面量語法,表示正則表達式的模式,為正則表達式的標志。字面量形式的正則表達式一般使用較多,也推薦大家盡可能使用這種形式,簡潔易讀,符合正常的使用習慣。
正則表達式一直是js里比較難以掌握的點。 看不懂,學不會,記不住。 每次需要用到正則的時候,都需要再去查找資料。 今天花時間把正則的知識點總結下,希望能在理解的基礎上熟練掌握。
正則表達式的作用正則表達式在字符串處理方面發揮著巨大的作用,掌握了它,就能針對某一特定模式的字符串或者批量對字符串進行處理。 雖然各個編程語言對正則的支持不同,但是差異并不大。 這里只介紹js語言中正則的使用方法。
javascript對正則表達式的支持先看一段代碼:
var formatPrice = function(price){ return price.toString().replace(/B(?=(d{3})+$)/g, ","); }
這個formatPrice函數將商品總價轉化為每三位以","分割的字符串,這是業務中常遇到的情況。 可以看到,通過使用正則,代碼變得相當的簡潔。
在js中創建正則的兩種方式使用字面量
/pattern/flags, 這就是正則表達式的字面量語法,pattern表示正則表達式的模式,flags為正則表達式的標志。比如: /a[bc]d{2}$/gi。
其中模式和標志的知識將會在后面詳細介紹。
字面量形式的正則表達式一般使用較多,也推薦大家盡可能使用這種形式,簡潔易讀,符合正常的使用習慣。
使用構造函數
除了使用字面量外,還可以使用構造函數生成正則表達式。
new RegExp(pattern [, flags]), 比如:var reg= new RegExp("[a-zA-Z]+d$", "gi")
這里構造函數的兩個參數,第一個參數可以是字符串(es5及以前)或正則表達式(es6),第二個可選參數為字符串。
當我們事前不能確定正則表達式的值時,或者正則依賴第三方輸入來動態生成正則時,需要使用這種方式。
這里要注意的一點是:第一個參數為一個字符串時,當我們使用正則里的特殊字符,比如d或等時,需要對進行轉義,也就是寫成d或的形式,因為在字符串里有特殊含義。
由于正則的使用場景主要是字符串處理,所以字符串類提供了很多方法使用正則表達式。比如:
str.replace(regexp|substr, newSubStr|function) str.search(regexp) str.match(regexp) str.split([separator[, limit]])
另外,正則表達式本身也提供了處理字符串的方法,比如:
regexObj.exec(str)
regexObj.test(str)
這些方法將再后面介紹
正則表達式的語法 flags - 標識符g - global,全局匹配,找到所有的匹配,而不是在第一個匹配后停止
i - ignoreCase 忽略大小寫
m - multiline 多行搜索,不使用"m"模式時,整個字符串會被當做一行,換行符也被當做正則里的一個字符,使用"m"模式時,字符串換行后的內容會被當做新的一行。
元字符正則表達式有兩種基本字符類型組成:
原義字符 - 代表他們本身含義的字符
元字符 - 在正則表達式中有特殊含義的非字母字符
比如: . * + ? () [] {} ^ $ |
字符類. - 匹配任意單個字符,行結束符除外
d - 匹配任意阿拉伯數字,相當于[0-9]
D - 匹配任意一個不是阿拉伯數字的字符,相當于1, 這里^用在[]中表示取反的意思。
w - 匹配任意阿拉伯字母,數字和下劃線, 相當于[0-9a-zA-Z_]
W - 與w相反, 相當于2
s - 匹配一個空白符,包括空格符,制表符,換行符,換頁符和其他空格字符。
S - 匹配一個非空白符,與上面相反
- 匹配一個水平制表符
- 匹配一個回車符
- 匹配一個換行符
v - 匹配一個垂直制表符
還有其他一些不常用的字符類,具體可查閱MDN文檔
字符集合[abc] - 又叫字符組,表示匹配集合中的任意一個字符,可以用-來指定范圍
[^abc] - 反義字符組,匹配不是集合中字符的一個字符,可以用-來指定范圍
邊界^ - 不使用在[]中時,表示匹配輸入開始
$ - 匹配輸入結尾
- 匹配零寬單詞邊界
B - 匹配零寬非單詞邊界,與上面b含義相反。
量詞? - 匹配0次或1次
+ - 匹配一次或多次
* - 匹配0次或多次
{n} - 匹配n次
{m,n} - 匹配最少m次,最多n次
{m,} - 匹配最少m次
貪婪模式和非貪婪模式舉個例子, /d{3,6}/g,這樣一個正則表達式如果匹配字符串"234955033",是匹配3或4,5,6個數字呢?
js中正則表達式會默認盡可能多的匹配,也就是匹配6個數字,即貪婪模式。
非貪婪模式則是讓正則表達式盡可能少的匹配,也就是只匹配3個數字,正則要使用非貪婪模式,只需要在量詞后面加上?即可。
下面一個例子:
"123456789".replace(/d{3,6}/g, "X") //貪婪模式,結果為"XX" "123456789".replace(/d{3,6}?/g, "X") //非貪婪模式,結果為"XXX"分組
() - 將正則表達式分組,以控制量詞的作用范圍,比如:baron{3} 和 (baron){3},二者是有區別的。
| - 表示 或,也可以配合()進行使用,比如: foo|bar 和 fo(o|b)ar
反向引用和忽略分組有時,我們在匹配到正則對應的字符串時,還想要使用匹配到的部分內容,這時候可以使用$1,$2,$3等符號引用分組捕獲的內容。
比如:
"12/03/2017".replace(/(d{2})/(d{2})/(d{4})/, "$3-$1-$2") //輸出2017-12-03
這里為了獲得年月日的引用,使用()給正則添加了三個分組,然后就可以從前往后分別用$1 $2 $3代替分組捕獲的內容。
所有()里匹配到的內容默認都會被捕獲到,有時候,我們只是想要使用()簡單的分組功能,而不需要讓正則表達式捕獲分組內容,此時,只需要在分組內添加?:即可,比如:
"12/03/2017".replace(/(d{2})/(?:d{2})/(d{4})/, "$2-$1") //輸出2017-12月,第二個分組的內容被忽略。前瞻,后顧和斷言
這里出現了三個新的概念,但其實他們也很簡單。
首先,我們要分清何為前,何為后。
正則匹配字符串是從前往后解析,所以,往字符串尾部方向叫前瞻,往字符串頭部方向叫后顧。
js中的正則表達式支持前瞻不支持后顧,所以這里只介紹前瞻。
前瞻一般結合斷言使用,其實斷言(assert)就相當于給正則加的一個限制條件 -- 表示匹配項不僅要符合正則表達式,而且要符合斷言給出的條件。
正向前瞻 - exp(?=assert),比如/d{2}(?=a)/ 表示匹配兩個數字且后面必須有字母a跟隨
負向前瞻 - exp(?!assert),比如/d{2}(?!a)/ 表示匹配兩個數字且后面沒有字母a跟隨
注意: 斷言只是相當于正則的條件,并不會真正的匹配相應的字符。
我們再來分析開頭給出的那段代碼:
price.toString().replace(/B(?=(d{3})+$)/g, ","); 正則 /B(?=(d{3})+$)/g中, d{3}+$表示以一個或多個三個數字結尾, ?=表示這部分是斷言,是正則的條件,即匹配一個零寬的非單詞邊界,且后面有(3,6,9...)個數字字符的情況js中正則表達式api 正則的實例屬性
一個正則表達式的實例具有以下一些實例屬性
multiline - 布爾值,表示正則是否多行匹配,對應于標志中的"m"
global - 布爾值,表示是否全局匹配,對應于標志中的"g"
ignoreCase - 布爾值,表示是否忽略大小寫,對應于標志中的"i"
source - 字符串,是正則表達式模式的字符串表示,比如/d{2}ac/gi的source屬性就是"d{2}ac", 該值不會包含正則兩邊的//和標志gi,也不會像構造函數參數那樣對進行轉義。
lastIndex - 整數,表示下一次匹配的起始位置,該值只有在"g"模式下才有用,在不全局匹配時始終是0
正則的實例方法正則表達式主要有兩個實例方法test和exec。
假設regexp表示一個正則的實例,str表示一個字符串,那么
regexp.test(str) - 返回一個布爾值,如果找到匹配項,返回true,否則false。
reg.exex(str) - 返回一個數組, 數組第一項為匹配到的字符串,后面項依次為分組捕獲到的信息,該數組還具有input和index兩個屬性,input表示進行匹配的字符串 - 即參數str,index表示匹配到的字符串的起始位置。
這里要注意的是:應用了全局"g"標志和沒有全局"g"標志的同一個模式的正則,對于同一個字符串,兩種方法的表現可能是不同的。 因為如果沒有全局標識,每次都會從字符串起始位置0開始匹配,而應用了"g",會從上次匹配的結束位的下一位開始匹配。
正則的靜態屬性正則的構造函數RegExp具有一些靜態屬性,這些屬性中保存著最新一次正則匹配的信息。
比如RegExp.$1-$9中,保存著最近一次匹配中分組捕獲到的信息。
還有一些其他的靜態屬性,但平時使用較少,不再介紹,具體可查閱MDN文檔。
String.prototype.search(regexp) - 返回匹配到的子字符串的索引或者-1, 會忽略正則中的"g"標志
String.prototype.match(regexp) - 返回一個數組,這里是否有"g"標識會對返回值產生影響,如果正則沒有"g"標志,那么返回的數組的上面正則的exec返回的數組形式相同。 如果有"g"標志,返回的是一個包含所有匹配子字符串的數組,且該數組也不再有input和index屬性。
String.prototype.split(regexp) - split的參數除了是一個字符串外,還可以是一個正則表達式。
String.prototype.replace(str|regexp, replaceStr|function)
字符串的replace是一個非常強大的方法,來看一個例子:
//我們想把"a1b2c3d4e5"這個字符串替換成字母后數字都加1,變成"a2b3c4d5e6" "a1b2c3d4e5".replace(/d/g, function(match, index, origin){ return parseInt(match) + 1 })
以上就是關于正則的全部總結,精力有限,寫的比較亂,見諒。
這里推薦一個非常好的介紹js正則表達式的課程慕課網-javaScript正則表達式
《javascript高級程序設計》
Regexper正則圖形化工具
MDN正則表達式
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95967.html
摘要:如果你知道正則表達式模式將會改變,或者你事先不知道什么模式,而是從另一個來源獲取,如用戶輸入,這些情況都可以使用構造函數。 為什么要使用正則表達式 正則表達式通過由普通字符和特殊字符組成的文字模板完成對字符串的校驗,搜索,替換。在javascript中類似這樣 /^1d{10}$/ 上面的這個簡單的正則用來匹配手機號至于說正則表達式到底有什么意義,借由《精通正則表達式》里面的一句話來概...
摘要:簡言本文給出了兩個密碼強度的正則表達式方案,一個簡單,一個更復雜和安全。要寫出正確的正則表達式,先要定義表達式規則。重復在正則表達式中用來表示元素重復出現的次數。你可以根據項目需要,自己調整上述正則表達式。 簡言 本文給出了兩個密碼強度的正則表達式方案,一個簡單,一個更復雜和安全。并分別給出了兩個方案的解析和測試程序。一般大家可以根據自己的項目的實際需要,自行定義自己的密碼正則約定。 ...
摘要:首先推薦幾個正則表達式編輯器正則表達式是一種查找以及字符串替換操作。此表所列的常用正則表達式,除個別外均未在前后加上任何限定,請根據需要,自行處理。例如對而言,則采用一對引號來確定正則表達式的邊界。 這篇文章本來很早就要寫的,拖了挺久的,現在整理下,供大家學習交流哈! 基本概念 正則表達式是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為元字符)。模式描述在搜...
閱讀 2633·2021-11-23 09:51
閱讀 888·2021-09-24 10:37
閱讀 3618·2021-09-02 15:15
閱讀 1966·2019-08-30 13:03
閱讀 1886·2019-08-29 15:41
閱讀 2632·2019-08-29 14:12
閱讀 1429·2019-08-29 11:19
閱讀 3307·2019-08-26 13:39