RegExp對(duì)象
字面量
var reg=/\bis\b/g;
定義變量reg
然后把正則表達(dá)式文本寫(xiě)到兩個(gè)反斜杠之間绊谭,"\正則文本\"
犁跪。\b
代表單詞邊界,\bis\b
代表正則is單純后面再加個(gè)\b
是保證is
是一個(gè)完整的單詞,而不是兩個(gè)字符。
var reg=/\bis\b/;
"He is a boy .This is a dog.Where is she?".replace(reg,'IS');
//"He IS a boy .This is a dog.Where is she?"
發(fā)現(xiàn)就匹配了第一個(gè)單純is
板甘。
我們使用g
,也就是代表全文搜索匹配详炬。var reg=/\bis\b/g;
var reg=/\bis\b/g;
"He is a boy .This is a dog.Where is she?".replace(reg,'IS');
//"He IS a boy .This IS a dog.Where IS she?"
構(gòu)造函數(shù)
var reg=new RegExp("\\bis\\b","g");
使用new
操作符來(lái)調(diào)用構(gòu)造函數(shù)盐类,構(gòu)造函數(shù)接收兩個(gè)參數(shù),第一個(gè)字符串里面是正則表達(dá)式的文本呛谜,這里有些特殊的地方就是反斜線寫(xiě)了兩次在跳,是因?yàn)镴avascript中反斜線本身就是特殊字符,如果我們想使用的話隐岛,就要進(jìn)行轉(zhuǎn)義猫妙,然后第二個(gè)參數(shù)是字符串,也是標(biāo)志g
也就是代表全文搜索匹配
var reg=new RegExp("\\bis\\b","g");
"He is a boy .This is a dog.Where is she?".replace(reg,'IS');
//"He IS a boy .This IS a dog.Where IS she?"
修飾符
g
:global全文搜索聚凹,不添加割坠,搜索到第一個(gè)匹配停止
"He is a boy .This is a dog.Where is she?".replace(/\bis\b/g,'IS')
"He IS a boy .This IS a dog.Where IS she?"
i
:ignore case 忽略大小寫(xiě),默認(rèn)大小寫(xiě)敏感
"He Is a boy .This is a dog.Where is she?".replace(/\bis\b/gi,'hello')
"He hello a boy .This hello a dog.Where hello she?"
m
:multiple lines 多行搜索
var mulSrt = "@123\n@321\n@876"
mulSrt
"@123
@321
@876 "
mulSrt.replace(/@\d/g, "G")
"G23
G21
G76 "
mulSrt.replace(/^@\d/g, "G")
"G23
@321
@876 "
mulSrt.replace(/^@\d/gm, "G")
"G23
G21
G76 "
元字符
正則表達(dá)式由兩種基本字符類型組成:
原義文本字符
原義文本字符意思就是代表它本來(lái)含義的字符比如/a/
就是想匹配a
"jj abc a b c vf".replace(/a/gi,'hello')
//"jj hellobc hello b c vf"
寫(xiě)/abc/
就是想匹配abc
"jj abc a b c vf".replace(/abc/gi,'hello')
//"jj hello a b c vf"
這些都是原義文本字符妒牙。
元字符
元字符實(shí)在正則表達(dá)式中有特殊含義的非字母字符
比如\b
它匹配的是單詞邊界彼哼,他的意思并不是匹配一個(gè)反斜線一個(gè)字母b,意思是匹配一個(gè)單詞邊界湘今。這種就是特殊字符敢朱。
在正則表達(dá)式中有幾個(gè)字符需要注意他們都是有特殊含義的。
字符類
我們工作時(shí)希望并不是匹配某個(gè)字符,而是希望匹配符合一系列特征abc
蔫饰。
我們可以使用元字符[]
來(lái)構(gòu)建一個(gè)簡(jiǎn)單的類琅豆。
類就是符合某些特征的對(duì)象,是指一個(gè)泛指篓吁,而不是特指某個(gè)字符茫因。
比如我們使用表達(dá)式[abc]
就把a(bǔ)或者b或者c自定義成為一類,表達(dá)式就可以匹配這類的字符杖剪。他的意思是有它們一個(gè)就行冻押。
"a1b2c3".replace(/[abc]/g,'x')
//"x1x2x3"
這樣我們發(fā)現(xiàn)abc對(duì)應(yīng)的地方都進(jìn)行替換了,
字符來(lái)取反
使用元字符^
創(chuàng)建反向類/負(fù)向類
反向類的意思是不屬于某類的內(nèi)容
表達(dá)式[^abc]
表示不是字符a或b或c的內(nèi)容
"a1b2c3".replace(/[^abc]/g,'x')
//"axbxcx"
把字符a或b或c以為外的字符替換成x了
范圍類
正則表達(dá)式提供了范圍類
我們可以使用[a-z]
來(lái)鏈接兩個(gè)字符表示從a到z的任意字符
這是一個(gè)閉區(qū)間盛嘿,也就是包含a和z本身
"a1b2c3x4z9".replace(/[a-z]/g,'Q');
//"Q1Q2Q3Q4Q9"
會(huì)發(fā)現(xiàn)a-z字母都被替換
在[]
組成的類內(nèi)部是可以連寫(xiě)的[a-zA-Z]
"a1b2c3x4z9ASDFGGG".replace(/[a-zA-Z]/g,'Q');
"Q1Q2Q3Q4Q9QQQQQQQ"
匹配所有數(shù)字
"2016-11-12".replace(/[0-9]/g,'Q');
"QQQQ-QQ-QQ"
匹配所有數(shù)字和橫線
"2016-11-12".replace(/[0-9-]/g,'Q');
"QQQQQQQQQQ"
JS預(yù)定義類及邊界
正則表達(dá)式預(yù)定義類:
字符 | 含義 |
---|---|
. | 除了回車符和換行符之外的所有字符洛巢,等價(jià)于[^\r\n] |
\d | 數(shù)字字符,等價(jià)于[0-9] digit |
\D | 非數(shù)字字符,等價(jià)于[^0-9] |
\s | 空白符,等價(jià)于[\t\n\x0B\f\r] space |
\S | 非空白符,等價(jià)于[^\t\b\x0B\f\r] |
\w | 單詞字符(字母,數(shù)字次兆,下劃線),等價(jià)于[a-zA-Z_0-9] word |
\W | 非單詞字符,等價(jià)于[^a-zA-Z_0-9] |
例子:
匹配一個(gè)ab+數(shù)字+任意字符
的字符串
/ab[0-9][^\r\n]/
"ab12334455sss".replace(/ab[0-9][^\r\n]/g,'Q');
//"Q334455sss"
或者
/ab\d.
"ab3klll".replace(/ab\d./g,"z")
//"zlll"
邊界
字符 | 含義 |
---|---|
^ | 以xxx開(kāi)始 |
$ | 以xxx結(jié)束 |
\b | 單詞邊界 |
\B | 非單詞邊界 |
\b
單詞邊界
匹配字符
"This is a boy".replace(/is/g,'0')
//"Th0 0 a boy"
會(huì)發(fā)現(xiàn)所以 is
都被替換
如果想替換單詞稿茉,單詞前后是有單詞邊界,所以要寫(xiě)上邊界"This is a boy".replace(/\bis\b/g,'0')
"This is a boy".replace(/\bis\b/g,'0')
//"This 0 a boy"
\B
非單詞邊界
如果想替換This
的is
芥炭,觀察下特征漓库,發(fā)現(xiàn)前面并不是邊界,后面是邊界那就這樣寫(xiě)"This is a boy".replace(/\Bis\b/g,'0')
"This is a boy".replace(/\Bis\b/g,'0')
//"Th0 is a boy"
^
以xxx為開(kāi)始
"@123@abc@".replace(/@./g,'Q');
//"Q23Qbc@"
匹配全局@和任意字符
"@123@abc@".replace(/^@./g,'Q');
//"Q23@abc@"
以@和任意字符作為開(kāi)始后面的不匹配
$
以xxx為結(jié)束
"@123@abc@".replace(/.@/g,'Q');
//"@12QabQ"
匹配全局任意字符和@
"@123@abc@".replace(/.@$/g,'Q');
//"@123@abQ"
匹配最后一個(gè)任意字符和@
var mulSrt = "@123\n@321\n@876"
mulSrt
"@123
@321
@876 "
mulSrt.replace(/@\d/g, "G")
"G23
G21
G76 "
mulSrt.replace(/^@\d/g, "G")
"G23
@321
@876 "
mulSrt.replace(/^@\d/gm, "G")
"G23
G21
G76 "
量詞
字符 | 含義 |
---|---|
园蝠? | 出現(xiàn)零次或一次(最多出現(xiàn)一次) |
+ | 出現(xiàn)一次或多次(至少出現(xiàn)一次) |
* | 出現(xiàn)零次或多次(任意次) |
{n} | 出現(xiàn)n次 |
{n,m} | 出現(xiàn)n到m次 |
{n,} | 至少出現(xiàn)n次 |
我們希望匹配一個(gè)連續(xù)出現(xiàn)20次數(shù)字的字符串
/\d\d\d\d\d\d\d\d..../反斜杠加d表示數(shù)字表示數(shù)字出現(xiàn)20次把他寫(xiě)20遍這樣非常麻煩如果出現(xiàn)100次那就要寫(xiě)100遍嗎渺蒿。為了解決這個(gè)問(wèn)題正則表達(dá)式引入了量詞的概念。
"12341111133333333111111111111".replace(/\d{20}/g,"d")
//"d111111111"
匹配數(shù)字兩次
"1234".replace(/\d{2}/g,"d")
//"dd"
JS正則貪婪模式與非貪婪模式
貪婪模式
了解了量詞我們看這樣一個(gè)場(chǎng)景彪薛。
/\d{3,6}/
數(shù)字匹配3到6次茂装,我們用12345678
來(lái)執(zhí)行,我們寫(xiě)的正則表達(dá)式是匹配數(shù)字3到6次善延,這個(gè)字符串中少态,即可以滿足3次4次5次6次,都是可以滿足的易遣,那么正則表達(dá)式這時(shí)候該怎么處理彼妻?
正則表達(dá)式在處理的時(shí)候會(huì)盡可能多的匹配,直到匹配失敗训挡。
"12345678".replace(/\d{3,6}/g,'A')
//"A78"
我們看到澳骤,他是匹配123456,78沒(méi)有匹配到澜薄,也就是說(shuō)他是盡可能多的匹配而不是少的匹配为肮。
這就是貪婪模式
非貪婪模式
讓正則表達(dá)式盡可能少的匹配,也就是說(shuō)一旦匹配成功匹配不再繼續(xù)嘗試肤京,就是非貪婪模式颊艳。
做法很簡(jiǎn)單茅特,在量詞后面加上?
即可。
"12345678".replace(/\d{3,6}?/g,'A')
"AA78"
這個(gè)時(shí)候的執(zhí)行結(jié)果就是123棋枕,456后面兩個(gè)78沒(méi)有被匹配到白修。
分組
匹配字符串Byron連續(xù)出現(xiàn)3次的場(chǎng)景。
沒(méi)有接觸量詞的時(shí)候我們把這個(gè)單詞寫(xiě)3遍重斑,接觸量詞之后我們可能會(huì)這樣寫(xiě)Byron{3}
但是它代表的含義和我們預(yù)期的并不是一致的兵睛。實(shí)際上是n
重復(fù)3次,前面不重復(fù)窥浪,量詞是作為緊挨著它的字符祖很,并不是整個(gè)單詞,否則怎么知道你匹配到哪漾脂。
"ByronByronByron".replace(/Byron{3}/g,'A')
//"ByronByronByron"
"ByronnnByronByron".replace(/Byron{3}/g,'A')
//"AByronByron"
那么如何讓他匹配整個(gè)單詞呢假颇?或者是我們?nèi)Χǖ膬?nèi)容,那么就用到分組
使用()
可以達(dá)到分組功能骨稿,使量詞作用于分組笨鸡。
(Byron){3}
這樣寫(xiě)就能達(dá)到我們預(yù)期效果。整個(gè)單詞重復(fù)了3遍坦冠。
比如想匹配一個(gè)小寫(xiě)字母加一個(gè)數(shù)字連續(xù)出現(xiàn)3次a1b2c3d4
`a1b2c3d4`.replace(/[a-z]\d{3}/g,"A")
//"a1b2c3d4"
這樣寫(xiě)是匹配不到的形耗,因?yàn)?code>\d{3}是找數(shù)字出現(xiàn)3次的場(chǎng)景。
我們將他分組即可
`a1b2c3d4`.replace(/([a-z]\d){3}/g,"A")
//"Ad4"
這樣就達(dá)到效果了蓝牲。這樣量詞作用于整個(gè)分組趟脂。
或
使用|
可以達(dá)到或的效果
"ByronCasper".replace(/Byron|Casper/g,"A");
//"AA"
這樣兩個(gè)都被匹配到了泰讽。
分組在或中的使用
"ByronsperByrCasper".replace(/Byr(on|Ca)sper/g,"A");
//"AA"
反向引用
比如我們想把2016-11-25
變成11/25/2016
如果只是想把-
替換成/
是很簡(jiǎn)單的
"2016-11-25".replace(/-/g,'/')
//"2016/11/25"
但是它順序也變了例衍,
以往的寫(xiě)法
"2016-11-25".replace(/\d{4}-\d{2}-\d{2}/g,'11/25/2016')
//"11/25/2016"
但是需要匹配的值變成了2016,月份可能變成11已卸,我們想替換他本身佛玄,替換的內(nèi)容不再是一個(gè)常量,而是一個(gè)變量累澡。這個(gè)時(shí)候該怎么處理梦抢?
我們用反向引用,
"2016-11-25".replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2/$3/$3')
"11/25/25"
我們用$
引用分組內(nèi)內(nèi)容愧哟,我們對(duì)分組內(nèi)容進(jìn)行捕獲奥吩,捕獲后用$1$2$3
來(lái)代替。
"2016-11-25".replace(/(\d{4})-(\d{2})-(\d{2})/g,'$1')
//"2016"
"2016-11-25".replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2')
//"11"
"2016-11-25".replace(/(\d{4})-(\d{2})-(\d{2})/g,'$3')
//"25"
"2016-11-25".replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2/$3/$3')
"11/25/25"
忽略分組
不希望捕獲某些分組蕊梧,只需要在分組內(nèi)加上?:
就可以霞赫。
"abcaok".replace(/(abc).(ok)/g,'$1/$2')
//"abc/ok"
"abcaok".replace(/(?:abc).(ok)/g,'$1/$2')
//"ok/$2"
前瞻
正則表達(dá)式的前瞻:
- 正則表達(dá)式從文本頭部向尾部開(kāi)始解析,文本尾部方向肥矢,成為“前”
- 前瞻 就是在正則表達(dá)式匹配到規(guī)則的時(shí)候端衰,向前檢查是否符合斷言。比如找到兒子為張三,還得看看他的父親是否是李四
后顧/后瞻方向相反
注意:JavaScript不支持后顧
匹配單詞數(shù)字加數(shù)字
"a2*3".replace(/\w(\d)/g,"A");
//"A*3"
匹配單詞數(shù)字旅东,注:這個(gè)單詞數(shù)字后面必須有數(shù)字才會(huì)匹配灭抑,(?=\d)
不能算在匹配內(nèi)容,這是斷言抵代。
"a2*3".replace(/\w(?=\d)/g,"A");
//"A2*3"
寫(xiě)個(gè)復(fù)雜點(diǎn)的案例
"a2*34v8".replace(/\w(?=\d)/g,"A");
//"A2*A4A8"
a2
*34``v8
這三個(gè)符合要求
"a2*34vv".replace(/\w(?=\d)/g,"A");
//"A2*A4vv"
a2
*34
vv腾节,這里只有兩個(gè)匹配vv
v是對(duì)的但是它后面不是數(shù)字,所以不成功荤牍。
現(xiàn)在改一下比配后面不是數(shù)字的
"a2*34vv".replace(/\w(?!\d)/g,"A");
"aA*3AAA"
a2*``34``vv
,2變成A禀倔。4vv都符合所以是AAA
js對(duì)象屬性
描述 | 默認(rèn) |
---|---|
g:global是否全文搜索 | 默認(rèn)false |
i:ignore case是否大小寫(xiě)敏感 | 默認(rèn)false |
m:multiline多行搜索 | 默認(rèn)值false |
lastIndex:當(dāng)前正則表達(dá)式匹配內(nèi)容的最后一個(gè)字符的下一個(gè)位置(即下一次匹配開(kāi)始的位置)。 | |
source : 正則表達(dá)式的文本字符串参淫。 |
test 和 exec方法
正則表達(dá)式本身的兩個(gè)方法
1.test
RegExp.prototype.test(str)
用于測(cè)試字符串參數(shù)中是否存在匹配正則表達(dá)式模式的字符串
如果存在則返回true救湖,否則返回false
lastIndex 記錄當(dāng)前匹配結(jié)果的、最后一個(gè)字符的涎才、下一個(gè)字符的位置
注意:test()方法在匹配的時(shí)候當(dāng)匹配到一個(gè)結(jié)果時(shí)鞋既,會(huì)從lastIndex位置開(kāi)始匹配下一個(gè)結(jié)果,直到不存在的時(shí)候才置為0耍铜。因此邑闺,當(dāng)使用全局g屬性標(biāo)識(shí)時(shí),當(dāng)匹配到最后一個(gè)結(jié)果時(shí)棕兼,lastIndex值指向不存在的位置陡舅,此時(shí)再執(zhí)行test()會(huì)返回false。
例子:多次執(zhí)行test()方法伴挚,會(huì)在true靶衍、false之間循環(huán)
(/\w/g).test('a')每次執(zhí)行都是正確的,但是通過(guò)實(shí)例化對(duì)象茎芋,需要很大的開(kāi)銷
test()方法:原意就是測(cè)試有沒(méi)有颅眶、能不能匹配上,當(dāng)使用test原意時(shí)田弥,沒(méi)必要加g
2.exec
RegExp.prototype.exec(str)
使用正則表達(dá)式模式對(duì)字符串執(zhí)行搜索涛酗,并將更新全局RegExp對(duì)象的屬性一反映匹配結(jié)果
如果沒(méi)有匹配的文本則返回 null,否則返回一個(gè)結(jié)果數(shù)組:
- index 聲明匹配文本的第一個(gè)字符位置
- input 存放被檢索的字符串 string
非全局調(diào)用
調(diào)用非全局的RegExp對(duì)象的 exec()時(shí)偷厦,返回?cái)?shù)組
第一個(gè)元素是與正則表達(dá)式相匹配的文本
第二個(gè)元素是與RegExpObject的第一個(gè)子表達(dá)式相匹配的文本(如果有的話)
第三個(gè)元素是與RegExp對(duì)象的第二個(gè)子表達(dá)式相匹配的文本(如果有的話)商叹,以此類推
字符串對(duì)象方法
String.prototype.search(reg)
search() 方法用于檢索字符串中指定的子字符串,或檢索與正則表達(dá)式相匹配的子字符串只泼。
語(yǔ)法
stringObject.search(regexp)
參數(shù) | 描述 |
---|---|
regexp | 該參數(shù)可以是需要在 stringObject 中檢索的子串剖笙,也可以是需要檢索的 RegExp 對(duì)象。注釋:要執(zhí)行忽略大小寫(xiě)的檢索辜妓,請(qǐng)追加標(biāo)志 i枯途。 |
返回值
stringObject 中第一個(gè)與 regexp 相匹配的子串的起始位置忌怎。
注釋:如果沒(méi)有找到任何匹配的子串,則返回 -1酪夷。
說(shuō)明
search() 方法不執(zhí)行全局匹配榴啸,它將忽略標(biāo)志 g。它同時(shí)忽略 regexp 的 lastIndex 屬性晚岭,并且總是從字符串的開(kāi)始進(jìn)行檢索鸥印,這意味著它總是返回 stringObject 的第一個(gè)匹配的位置。
"a1b1c1d1".search('1')
//1
"a1b1c1d1".search('10')
//-1
"a1b1c1d1".search(1)
//1
"a1b1c1d1".search(/1/)
//1
String.prototype.match(reg)
match() 方法可在字符串內(nèi)檢索指定的值坦报,或找到一個(gè)或多個(gè)正則表達(dá)式的匹配库说。
該方法類似 indexOf() 和 lastIndexOf(),但是它返回指定的值片择,而不是字符串的位置潜的。
參數(shù) | 描述 |
---|---|
searchvalue | 必需。規(guī)定要檢索的字符串值字管。 |
regexp | 必需啰挪。規(guī)定要匹配的模式的 RegExp 對(duì)象。如果該參數(shù)不是 RegExp 對(duì)象嘲叔,則需要首先把它傳遞給 RegExp 構(gòu)造函數(shù)亡呵,將其轉(zhuǎn)換為 RegExp 對(duì)象。 |
返回值
存放匹配結(jié)果的數(shù)組硫戈。該數(shù)組的內(nèi)容依賴于 regexp 是否具有全局標(biāo)志 g锰什。
說(shuō)明
match() 方法將檢索字符串 stringObject,以找到一個(gè)或多個(gè)與 regexp 匹配的文本丁逝。這個(gè)方法的行為在很大程度上有賴于 regexp 是否具有標(biāo)志 g汁胆。
如果 regexp 沒(méi)有標(biāo)志 g,那么 match() 方法就只能在 stringObject
中執(zhí)行一次匹配果港。如果沒(méi)有找到任何匹配的文本沦泌, match() 將返回
null糊昙。否則辛掠,它將返回一個(gè)數(shù)組,其中存放了與它找到的匹配文本有關(guān)的信息释牺。該數(shù)組的第 0
個(gè)元素存放的是匹配文本萝衩,而其余的元素存放的是與正則表達(dá)式的子表達(dá)式匹配的文本。除了這些常規(guī)的數(shù)組元素之外没咙,返回的數(shù)組還含有兩個(gè)對(duì)象屬性猩谊。index
屬性聲明的是匹配文本的起始字符在 stringObject 中的位置,input 屬性聲明的是對(duì) stringObject 的引用祭刚。
如果 regexp 具有標(biāo)志 g牌捷,則 match() 方法將執(zhí)行全局檢索墙牌,找到 stringObject
中的所有匹配子字符串。若沒(méi)有找到任何匹配的子串暗甥,則返回
null喜滨。如果找到了一個(gè)或多個(gè)匹配子串,則返回一個(gè)數(shù)組撤防。不過(guò)全局匹配返回的數(shù)組的內(nèi)容與前者大不相同虽风,它的數(shù)組元素中存放的是
stringObject 中所有的匹配子串,而且也沒(méi)有 index 屬性或 input 屬性寄月。
注意:在全局檢索模式下辜膝,match() 即不提供與子表達(dá)式匹配的文本的信息,也不聲明每個(gè)匹配子串的位置漾肮。如果您需要這些全局檢索的信息厂抖,可以使用 RegExp.exec()。
var str="Hello world!"
document.write(str.match("world") + "<br />")
document.write(str.match("World") + "<br />")
document.write(str.match("worlld") + "<br />")
document.write(str.match("world!"))
輸出
world
null
null
world!
正則方法非全局匹配
var reg3 = /\d(\w)/;
var reg4 = /\d(\w)/g;
var ts = '$1a2b3c4d5e';
var ret = ts.match(reg3);
console.log(ret); //["1a", "a", index: 1, input: "$1a2b3c4d5e"]
document.write(ret); //1a,a
正則方法全局匹配
var reg3 = /\d(\w)/;
var reg4 = /\d(\w)/g;
var ts = '$1a2b3c4d5e';
var ret = ts.match(reg4);
console.log(ret); //["1a", "2b", "3c", "4d", "5e"]
document.write(ret);//1a,2b,3c,4d,5e
String.prototype.match(reg)方法
split() 方法用于把一個(gè)字符串分割成字符串?dāng)?shù)組克懊。
基本用法
var op = 'a,b,c,d';
var spo = op.split(',');
console.log(spo);
//["a", "b", "c", "d"]
在一些復(fù)雜分割情況下可以用正則用法
var op = 'a1b2c3d';
var spo = op.split(/\d/);
console.log(spo);
//["a", "b", "c", "d"]
再?gòu)?fù)雜
var op = 'a,b|c?d';
var spo = op.split(/[,|\|\?]/g);
console.log(spo);
//["a", "b", "c", "d"]
String.prototype.replace方法
傳入兩個(gè)參數(shù)replace(找誰(shuí)验游,替換誰(shuí))
"a1b".replace(/1/,2)
//"a2b"
"a1b1c1".replace(/1/g,2)
//"a2b2c2"
"a1b1c1".replace(/\d/g,2)
"a2b2c2"
如果我想把"a1b2c3d4" => "a2b3c4d5"該怎么實(shí)現(xiàn)呢?
var h = "a1b2c3d4".replace(/\d/g, function(match, index, origin) {
//console.log(index);
return parseInt(match) + 1;
});
console.log(h);//a2b3c4d5
var h = "a1b2c3d4e5".replace(/(\d)(\w)(\d)/g, function(match, g1, g2, g3, index, origin) {
//console.log(index);
return g1 + g3;
});
console.log(h);//a12c34e5