摘要:于是對應著,對應著輸出月日年九前瞻正則表達式從文本頭部想穩步開始解析,文本尾部方向,稱為前。只是條件不參與匹配找英文數字下劃線而且后面跟著數字的。
基礎知識
一 元字符
單詞邊界 d 數字 [0-9] w 英文 數字 下劃線 [a-z0-9_] s 空白字符[ v f] 水平制表符,v垂直制表符, 換行符, 回車符,f換頁符 反義 B 非單詞邊界 D [^0-9] W [^a-z0-9_] S 非空白字符 [^ v f] . 任意字符 少用 .* 任意數量的不包含換行的字符 貪婪匹配 .? 懶惰 非貪婪匹配 u4e00-u9fa5 中文
二 量詞
{m,n} 匹配m-n次,優先匹配m次 {n,} 匹配n或以上次 {n} 匹配n次 ? 0或1,有或無 等于{0,1} + 1或以上等于{1,} * 0或n都可以 任意 等于{0,} eg: /d?/ //匹配1或0個數字 /d{2,4}/ //匹配2到4個數字 /s+javas+/ //匹配有1個或多個空格的字符串java /[^(]*/ //匹配1個或多個左括號
三 集合 字符類
[abc] 匹配a/b/c任意字符 [^abc] 匹配除了abc外的任意字符 [a-z] 匹配a到z任意字符 //注意:里面的-代表的是范圍 例如 "ahd-fj-k".replace(/[a-z]/g,"A") //輸出 》AAA-AA-A //如果我想把斜杠也替換了呢 有兩個方法 1. 利用轉義符 "ahd-fj-k".replace(/[a-z-]/g,"B") //輸出BBBBBBBB 2. 后面加多一個- "ahd-fj-k".replace(/[a-z-]/g,"B") //輸出BBBBBBBB //() 在集合里面默認被轉義了 like this //"(122)do(".replace(/[(d)]/g,"A") 輸出 AAAAAdoA //具體被轉義范圍不確定 歡迎普及補充
四 分支
123|34|567 //匹配123或34或567
五 邊界 開始結束
^ //代表開始 在[]代表非 $ //代表結束
六 修飾符
g //全局匹配 不寫的話匹配完第一個就停止 i //忽略大小寫 m //忽略換行 //上面3可疊加使用
七 貪婪模式和非貪婪模式
js默認貪婪模式 即最大可能的匹配
想要改成非貪婪模式在后面加個?
例子: "123456789".replace(/d{3,6}/,"XX") //輸出XX //貪婪模式先匹配了最多的 6個數字》X 剩下3個數字也算是符合就再多一個X "123456789".replace(/d{3,6}?/,"XX") //輸出XXX //非貪婪模式 優先匹配了最低要求的3個數字一次 〉 3個X
八 分組與引用與捕獲
分組是正則中非常強大的功能 可以讓上面提到的量詞作用與一組字符。
語法 圓括號包裹(*);
/([0-9])[a-z]+1{3}/.test("2aa222") //true /([0-9]+)[a-z]+1/.test("12aa12") //true /([0-9]+)[a-z]+1/.test("12aa13") //false //這里需要注意一個問題。分組"1"表示的并不是多個數字,而是和對應分組一模一樣的數字 /<([a-z]+)>.*1>/.test("sdlksdjkssdkl") // true
并不是所有用()起來的就能被捕抓成為分組的。
下面就要說到 非捕抓分組可以提高性能和簡化邏輯
用法:
**(***) //識別成為可捕抓分組 (?:***) //識別成為非捕抓分組** 例子: 把a1b2c3d4里面的數字都+1 "a1b2c3d4".replace(/(d)/g,function($1){ return $1*1+1 }) //輸出 a2b3c4d5 把2015-12-25 格式成 12月25日2015年 "2015-12-25".replace(/(d{4})-(d{2})-(d{2})/g,"$2月$3日$1年") //輸出 12月25日2015年 非捕抓例子: "2015-12-25".replace(/(d{4})-(?:d{2})-(d{2})/g,"$2月$3日$1年") //第二個()里面有?: 所以它不被捕抓成分組。 于是$1對應著2015, $2對應著25 //輸出 25月$3日2015年
九 前瞻
正則表達式從文本頭部想穩步開始解析,文本尾部方向,稱為“前”。
簡單理解為 從左到右
前瞻就是 向前檢查是否屬于斷言。
后顧/后瞻方向相反 但是javascript不支持后瞻。
正向前瞻 例子: "a2*3w4sb".replace(/w(?=d)/g,"X") //輸出X2*3X4sb //主角是w 只對它進行匹配。 //(?=d)這個就是斷言 就是條件。只是條件不參與匹配 //找w (英文|數字|下劃線) 而且后面跟著d 數字的。 //所以符合的有 a2的a w4的w; 負向前瞻 例子: "a2*3w4sb".replace(/w(?!d)/g,"X") //輸出 aX*XwXX //主角是w 只對它進行匹配。 //(?!d)這個就是斷言 就是條件。只是條件不參與匹配 //找w (英文|數字|下劃線) 而且后面不是d 數字的。 //所以符合的有 2*的2 3w的3 4s的4 sb的s b后面什么都沒跟所以符合;
Js風格 調用RegExp對象的構造函數 var reg = new RegExp("^[a-z]+[0-9]$", "gi") Perl風格 寫在斜杠中 var reg = /^[a-z]+[0-9]$/gi
常用
test 返回布爾值
例子: /^d+$/.test("12637") //true /^d+$/.test("sdk") //false
search 返回搜索到的對應位置 沒有則-1
//注意 search只查找一次,即使設置了g。重復調用也是從起始位置開始
例子 "ad1cd2c".search(/d/g) //2 第一個數字的位置 "adcd".search(/d/g) //-1 找不到
replace 替換
("a1b2c3").replace(/d/g,"數字") //a數字b數字c數字
split 分割成數組 里面也能寫正則。 如果找不到匹配分割的把自己變數組
"a12b23c34".split("1") //["a", "2b23c34"] "a12b23c34".split(/d{2}/g) //["a", "b", "c", ""] "a12b23c34".split(/[23]/g) //["a1", "b", "", "c", "4"] "a12b23c34".split(/[55]/g) //["a12b23c34"]
match 與 exec 返回數組 匹配到的字符串
兩者相似又不同。 寫法上不一樣
match是字符串方法,寫法為:str.match(reg)
exec是正則表達式方法,寫法為:reg.exec(str)
寫法: var reg = new RegExp("abc") ; var str = "3abc4,5abc6"; str.match(reg); var reg = new RegExp("abc") ; var str = "3abc4,5abc6"; reg.exec(str ); --------------------------------------- 無子表達式非全局時: **exec和match執行的結果是一樣,均返回第一個匹配的字符串內容;** var reg = new RegExp("[a-z]+") ; var str = "1abc2,3abc4"; alert(str.match(reg)); alert(reg.exec(str)); //都是輸出 abc 無子表達式全局匹配 : **match執行了全局匹配查詢;exec找到一個匹配即返回。** var reg = new RegExp("[a-z]+","g") ; var str = "1abc2,3bcd4"; console.log(str.match(reg)); //["abc", "bcd"] console.log(str.match(reg)); //["abc", "bcd"] console.log(reg.exec(str)); //["abc"] console.log(reg.exec(str)); //["bcd"] //match執行了全局匹配查詢;而exec逐次返回。 有子表達式 非全局: **match exec 都是返回結果 和分組** var reg = new RegExp("a(bc)") ; var str = "3abc4,5abc6"; console.log(str.match(reg)); //["abc", "bc"] console.log(reg.exec(str)); //["abc", "bc"] 有子表達式 全局: **match忽略子表達式,只查找全匹配正則表達式并返回所有內容; exec 依然逐次返回結果 分組 ** var reg = new RegExp("a(bc)","g") ; var str = "3abc4,5abc6"; console.log(str.match(reg)); //?["abc", "abc"] console.log(str.match(reg)); //?["abc", "abc"] console.log(reg.exec(str)); //?["abc", "bc", index: 1] console.log(reg.exec(str)); //?["abc", "bc", index: 7]
/^d+$/.test("2l") //只能輸入數字 /^d{n}$/.test("2222") //只能輸入n個數字 /^d{n,}$/.test("22222") //只能輸入n個以上數字 /^d{m,n}$/.test("22222") //只能輸入m到n個數字 /^[a-z]+$/i //只能輸入英文 /^[A-Z]+$/.test("SS’) //只能輸入大寫英文 /^[0-9a-z]+$/i.test("1223ddsSSk") //只能輸入英文和數字 /^w+$/.test("wS233_") //只能英文數字下劃線 /^[u4e00-u9fa5]+$/.test("大家看") //純中文 //匹配手機號 : 手機號 1開頭 34568 第二位 數字任意9位 /^1[3|4|5|6|8]{1}d{9}$/.test("13347834892") //匹配日期格式 YYYY-MM-DD 1/2開頭 3個數字 - [0|1][1-9] - [0-1][1-9] /^[1-9]d{3}-[0-1]d-[0-3]d$/.test("2017-12-20") //過濾html標簽: 以<開頭 >結尾的標簽 "幕中閃著兇光。
索拉卡".replace(/<[^<>]+>/g,"") //簡單版匹配email郵箱:英文數字下劃線 @ 英文數字 .com /^w+@[a-z0-9]+(.com)$/.test("@qq.com") // 網上看到的Email地址: ^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$
有很多在線正則可視化的網站也是很有意思 寫了可以拷貝進去檢查看看。
點擊跳轉去正則可視化網頁
mark一下 僅供參考 歡迎更正補充 end
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/54908.html
摘要:于是對應著,對應著輸出月日年九前瞻正則表達式從文本頭部想穩步開始解析,文本尾部方向,稱為前。只是條件不參與匹配找英文數字下劃線而且后面跟著數字的。 基礎知識 一 元字符 單詞邊界 d 數字 [0-9] w 英文 數字 下劃線 [a-z0-9_] s 空白字符[ v f] 水平制表符,v垂直制表符, 換行符, 回車符,f換頁符 反義 B 非單詞邊界 D [^0-9] W [^...
摘要:第二段代碼如下修改就可以了改這一行其實你的本質問題就在于誤認為是數組對象,然而它是構造函數。它繼承自構造函數被執行。故視為兩個字符串的拼接,結果為字符串,其長度為。 1.[] 和 Array 調用 slice 方法引起的問題 問題表示:在某些場景下,需要將函數的 arguments 參數作為一個數組調用,但是 arguments 是一個奇異對象,所以試著將 arguments 轉化為一...
閱讀 3933·2021-09-22 10:02
閱讀 3365·2019-08-30 15:52
閱讀 3061·2019-08-30 12:51
閱讀 755·2019-08-30 11:08
閱讀 2065·2019-08-29 15:18
閱讀 3106·2019-08-29 12:13
閱讀 3592·2019-08-29 11:29
閱讀 1872·2019-08-29 11:13