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