成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

簡(jiǎn)單學(xué)習(xí) JavaScript 正則表達(dá)式

nevermind / 1157人閱讀

摘要:對(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ò)程不一樣,效果是一樣的。

RegExp每個(gè)實(shí)例都有如下屬性:

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è)捕獲組

注意 IEjavascriptlastIndex 設(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

相關(guān)文章

  • 正則達(dá)式

    摘要:本文內(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)查...

    bang590 評(píng)論0 收藏0
  • JavaScript正則進(jìn)階之路——活學(xué)妙用奇淫正則達(dá)式

    摘要:正則大法好,正則大法好,正則大法好,重要的事情說(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í),共同...

    BearyChat 評(píng)論0 收藏0
  • JavaScript正則進(jìn)階之路——活學(xué)妙用奇淫正則達(dá)式

    摘要:正則大法好,正則大法好,正則大法好,重要的事情說(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í),共同...

    APICloud 評(píng)論0 收藏0
  • H5學(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ì)模式不能滿...

    aristark 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<