摘要:對(duì)于對(duì)象,方法返回一個(gè)該正則表達(dá)式的字面量。顯示顯示正則表達(dá)式在的應(yīng)用一個(gè)在字符串中執(zhí)行查找匹配的方法,它返回一個(gè)數(shù)組或者在未匹配到時(shí)返回。
為什么要用正則表達(dá)式
簡(jiǎn)單的說(shuō):我們與字符串接觸的頻率非常之高,正則表達(dá)式可以極大的提高復(fù)雜文本分析的效率,快速匹配出復(fù)雜的字符串。
創(chuàng)建一個(gè)正則表達(dá)式
直接量語(yǔ)法(字面量)
var expression = /pattern/flags ; //pattern 是要匹配的字符串模式 //flags用來(lái)標(biāo)記正則表達(dá)式的行為: i 不區(qū)分大小寫;g 表示全局搜索 ;m 表示多行模式 var reg = /ab/i ,表示匹配 字符串 "ab" 不區(qū)分大小寫
調(diào)用RegExp對(duì)象的構(gòu)造函數(shù)
//RegExp 是js中一個(gè)內(nèi)置的對(duì)象,是正則表達(dá)式的縮寫 var expression = new RegExp(pattern,flags) //flags 和直接量語(yǔ)法一致 //pattern 可以是字符串模式,也可以是一個(gè)標(biāo)準(zhǔn)的正則表達(dá)式,后者必須省略 flags //可以寫成var reg = new RegExp("ab","i") 或者var reg = new RegExp(/ab/i) //不能寫成 var reg = new RegExp(/ab/,"i")
在ES5中規(guī)定:使用直接量必須像直接調(diào)用RegExp構(gòu)造函數(shù)一樣,每次都創(chuàng)建一個(gè)新的RegExp實(shí)例,所以
上面2種方式創(chuàng)建正則表達(dá)式,除了過(guò)程不一樣,效果是一樣的。
global:布爾值,表示實(shí)例是否設(shè)置了 g 標(biāo)志
ignoreCase:布爾值,表示是否設(shè)置了 i 標(biāo)志
multiLine:布爾值,表示是否設(shè)置了m 標(biāo)志
source:返回創(chuàng)建RegExp對(duì)象實(shí)例時(shí)指定的表達(dá)式純文本字符串。不包含后面的標(biāo)志
lastIndex:整數(shù),表示實(shí)例在接下來(lái)的一次搜索匹配項(xiàng)的開始位置,默認(rèn)從0開始
使用正則表達(dá)式的實(shí)例方法RegExp.prototype.exec()
exec() 方法為指定的一段字符串執(zhí)行搜索匹配操作,返回包含第一個(gè)匹配項(xiàng)的數(shù)組,regexObj.exec(str) ,沒有匹配到則返回 null,返回的數(shù)組是Array的實(shí)例,而且返回值還包含另外2個(gè)屬性:index: 匹配到的字符位于原始字符串的基于0的索引值 和 input: 原始字符串`
var myRe = /ab*/g; var str = "abbcdefabh"; var oo = myRe.exec(str) // oo ==> ["abb"] // oo.index ==> 0 // myRe.lastIndex ==> 0 // 從返回結(jié)果可以看出來(lái),即使我們?cè)O(shè)置了全局的g,exec也不會(huì)一次性返回所有的匹配結(jié)果 // 因?yàn)槠涠x就是 返回包含`第一個(gè)匹配項(xiàng)`的數(shù)組,只要第一次匹配到,后面就不繼續(xù)執(zhí)行 // 我們?cè)賵?zhí)行一次 oo = myRe.exec(str) // oo ==> ["ab"] // oo.index ==> 3 // myRe.lastIndex ==> 3 // 再次執(zhí)行之后可以看到 匹配項(xiàng)和一些屬性值都發(fā)生了變化,說(shuō)明 這次并不是從頭開始
官方說(shuō)明:當(dāng)正則表達(dá)式使用 "g" 標(biāo)志時(shí),可以多次執(zhí)行 exec 方法來(lái)查找同一個(gè)字符串中的成功匹配。當(dāng)你這樣做時(shí),查找將從正則表達(dá)式的 lastIndex 屬性指定的位置開始(也就是說(shuō)下次的查詢將在上次匹配成功后面開始匹配,而且會(huì)循環(huán),在匹配不到的時(shí)候,會(huì)從頭開始)。(test() 也會(huì)更新 lastIndex 屬性)。
不加"g" 標(biāo)志的時(shí)候,每次都是從 0 開始,所以各種屬性也不會(huì)改變
exec() 方法還有一個(gè)重要的作用:匹配捕獲組
var str= "cat2,hat8" ; var reg=/c(at)/ ; console.info(reg.exec(str));//運(yùn)行返回 ["cat2", "at"] 加了捕獲組的時(shí)候,結(jié)果會(huì)把捕獲組一起返回,不加則沒有,支持多個(gè)捕獲組
注意 IE 的 javascript 在 lastIndex 設(shè)計(jì)上存在偏差,沒加g的情況下也會(huì)每次發(fā)生改變,慎用
RegExp.prototype.test()
接收一個(gè)字符串參數(shù),regexObj.exec(str),匹配返回true,否則false
RegExp.prototype.toString() ( RegExp.prototype.toLocaleString())
RegExp 對(duì)象覆蓋了 Object 對(duì)象的 toString() 方法,并沒有繼承 Object.prototype.toString()。對(duì)于 RegExp 對(duì)象,toString 方法返回一個(gè)該正則表達(dá)式的字面量。
myExp = new RegExp("a+b+c"); alert(myExp.toString()); // 顯示 "/a+b+c/" foo = new RegExp("bar", "g"); alert(foo.toString()); // 顯示 "/bar/g"正則表達(dá)式在 String 的應(yīng)用
match
一個(gè)在字符串中執(zhí)行查找匹配的String方法,它返回一個(gè)數(shù)組或者在未匹配到時(shí)返回null。
var oo = "121212".match(/1/g) oo //["1", "1", "1"] var oo = "121212".match(/1/) oo //["1"]
replace
一個(gè)在字符串中執(zhí)行查找匹配的String方法,并且使用替換字符串替換掉匹配到的子字符串。
"121212".replace(/1/g,",") //",2,2,2"
split
一個(gè)使用正則表達(dá)式或者一個(gè)固定字符串分隔一個(gè)字符串,并將分隔后的子字符串存儲(chǔ)到數(shù)組中的String方法。
//以數(shù)字分割字符串 "a1b2c33d4".split(/d*/) //["a", "b", "c", "d", ""]
search
一個(gè)在字符串中測(cè)試匹配的String方法,它返回匹配到的位置索引,或者在失敗時(shí)返回-1。
//查找連續(xù)2個(gè)數(shù)字的位置 "a1b2c33d4".search(/(d){2}/) // 5小練習(xí)
把一串?dāng)?shù)字字符串千分位方式(逗號(hào))轉(zhuǎn)化成金額符號(hào)
分析要點(diǎn):
金額的千分位是從右往左,每3位加一個(gè)逗號(hào),但是正則表達(dá)式里面從右往左不是很方便,所以第一步要把數(shù)字顛倒過(guò)來(lái),字符串并沒有直接的顛倒方法,數(shù)組有,Array.prototype.reverse.call([1,2,3,4]) ==>[4, 3, 2, 1],字符串轉(zhuǎn)數(shù)組也是很方便的,String.prototype.split.call("1234","") ==> ["1", "2", "3", "4"]
再把顛倒的數(shù)組拼接成字符串 Array.prototype.join.call([4,3,2,1],"")==> 4321
小數(shù)點(diǎn)后面的不需要處理,所以我們要獲取 String.prototype.split.call("12345.678",".")[1] ==> 12345 因?yàn)槲覀冞@里已經(jīng)反轉(zhuǎn)了,所以真正要轉(zhuǎn)化的數(shù)字在第二個(gè)
前面都是準(zhǔn)備工作,現(xiàn)在需要用正則表達(dá)式處理字符串,匹配連續(xù)的3位數(shù)字分割成數(shù)組 d{3} 表示連續(xù)3個(gè)數(shù)字 String.prototype.match.call("1234",/d{3}/) ==> ["123"],這里把后面的一位數(shù)字和2位數(shù)字直接忽略了,并且沒有全局匹配,所以我們要補(bǔ)充一下。
String.prototype.match.call("1234567891",/d{3}|d{2}|d{1}/g) //["123", "456", "789", "1"]
最后就把數(shù)組用逗號(hào)連接,在用小數(shù)點(diǎn)和之前的小數(shù)位加在一起,再像第一步那樣反轉(zhuǎn)一下順序就可以了。
例子代碼
function money_thousandth (str){ //先檢查是不是符合數(shù)字類型 if(isNaN(str)){ return "必須傳入數(shù)字或者數(shù)字字符串" } str = str.toString(); //反轉(zhuǎn)順序并分割小數(shù)點(diǎn) var arr = str.split("").reverse().join("").split("."); //全局優(yōu)先匹配連續(xù)的3位數(shù)字,或者2位,或者1位 var reg = /d{3}|d{2}|d{1}/g; //有小數(shù)點(diǎn)取第二位,沒有則取第一位 var thousand = arr[1] || arr[0] ; //分割數(shù)組 var result_arr = thousand.match(reg); //逗號(hào)拼接分割好的金額 var result_str = result_arr.join(","); //與小數(shù)點(diǎn)前面加起來(lái) var result = arr[1] ? arr[0] + "."+ result_str : result_str //返回顛倒的數(shù)字字符串 return result.split("").reverse().join("") } money_thousandth(1234567898.12) //"1,234,567,898.12" money_thousandth("1234567898.12") //"1,234,567,898.12"
點(diǎn)擊查看正則表達(dá)式常用語(yǔ)法
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80768.html
摘要:本文內(nèi)容共正則表達(dá)式火拼系列正則表達(dá)式回溯法原理學(xué)習(xí)正則表達(dá)式,是需要懂點(diǎn)兒匹配原理的。正則表達(dá)式迷你書問世了讓幫你生成和解析參數(shù)字符串最全正則表達(dá)式總結(jié)驗(yàn)證號(hào)手機(jī)號(hào)中文郵編身份證地址等是正則表達(dá)式的縮寫,作用是對(duì)字符串執(zhí)行模式匹配。 JS 的正則表達(dá)式 正則表達(dá)式 一種幾乎可以在所有的程序設(shè)計(jì)語(yǔ)言里和所有的計(jì)算機(jī)平臺(tái)上使用的文字處理工具。它可以用來(lái)查找特定的信息(搜索),也可以用來(lái)查...
摘要:正則大法好,正則大法好,正則大法好,重要的事情說(shuō)三遍。第二部分,這個(gè)部分是整個(gè)表達(dá)式的關(guān)鍵部分。學(xué)習(xí)正則如果還沒有系統(tǒng)學(xué)習(xí)正則表達(dá)式,這里提供一些網(wǎng)上經(jīng)典的教程供大家學(xué)習(xí)。正則表達(dá)式使用單個(gè)字符串來(lái)描述匹配一系列匹配某個(gè)句法規(guī)則的字符串。 原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動(dòng)態(tài),大家一起多交流學(xué)習(xí),共同...
摘要:正則大法好,正則大法好,正則大法好,重要的事情說(shuō)三遍。第二部分,這個(gè)部分是整個(gè)表達(dá)式的關(guān)鍵部分。學(xué)習(xí)正則如果還沒有系統(tǒng)學(xué)習(xí)正則表達(dá)式,這里提供一些網(wǎng)上經(jīng)典的教程供大家學(xué)習(xí)。正則表達(dá)式使用單個(gè)字符串來(lái)描述匹配一系列匹配某個(gè)句法規(guī)則的字符串。 原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動(dòng)態(tài),大家一起多交流學(xué)習(xí),共同...
摘要:為此決定自研一個(gè)富文本編輯器。本文,主要介紹如何實(shí)現(xiàn)富文本編輯器,和解決一些不同瀏覽器和設(shè)備之間的。 對(duì)ES6Generator函數(shù)的理解 Generator 函數(shù)是 ES6 提供的一種異步編程解決方案,語(yǔ)法行為與傳統(tǒng)函數(shù)完全不同。 JavaScript 設(shè)計(jì)模式 ② 巧用工廠模式和創(chuàng)建者模式 我為什么把他們兩個(gè)放在一起講?我覺得這兩個(gè)設(shè)計(jì)模式有相似之處,有時(shí)候會(huì)一個(gè)設(shè)計(jì)模式不能滿...
閱讀 3598·2023-04-26 00:05
閱讀 981·2021-11-11 16:55
閱讀 3576·2021-09-26 09:46
閱讀 3553·2019-08-30 15:56
閱讀 943·2019-08-30 15:55
閱讀 2964·2019-08-30 15:53
閱讀 1976·2019-08-29 17:11
閱讀 841·2019-08-29 16:52