某一個字符串為'a_b_2_d_1'
我想匹配到_后面的字母與數(shù)字,但是不匹配_,
于是我寫了:
let str = "a_b_2_d_1"
let result = str.match(/(?:_)[a-z0-9]+/gi);
console.log(result); //["_b", "_2", "_d", "_1"]
結(jié)果將_也匹配了進去,match是與(?:)不生效呢,還是為什么。
如果不用這種方式還能怎么寫呢?
你可以去查下match的用法,match根據(jù)正則表達式里面有沒有全局匹配g,會返回不同的結(jié)果,如果不是全局匹配,那么返回的結(jié)果是數(shù)組,第一個元素是匹配的完整字符串,從第二個元素開始是捕獲型括號的內(nèi)容;如果是全局匹配,返回的結(jié)果是一個數(shù)組,數(shù)組的每個元素都是匹配的完整字符串,沒有捕獲型括號的內(nèi)容。
使用exec,代碼如下:
let str = "a_b_2_d_1"
let re = /(?:_)([a-z0-9]+)/gi
let match
let result = []
while (match = re.exec(str)) {
result.push(match[1])
}
console.log(result)
我覺得你是想用零寬斷方。JS 的正則表達式支持正向零寬斷言,不支持負向零寬斷言(正向是向右),而你的需求是負向斷言 _ 號,所以用零寬斷言實現(xiàn)不了你的需求。
.split() 是一種比較取巧的解決辦法,如果需求不擴展的話,夠用了
如果實在需要通過正則表達式來取 _ 后的字母/數(shù)字,可以用 /_[a-z0-9]+?/g,得到 match 數(shù)組之后,再把前面的 _ 號去掉
s.match(/_[a-z0-9]+?/g).map(s => s.substr(1))
// ["b", "2", "d", "1"]
突然覺得我理解錯了,你應(yīng)該不是想用零寬斷言,而是搞錯了 (?:) 的意思。
在正則表達式不帶 g 參數(shù)的時候,括號內(nèi)的匹配內(nèi)容會保存下來,比如
m = s.match(/(_)[a-z0-9]+?/)
// ["_b", "_"]
數(shù)組第一個元素是正則表達式匹配到的整個字符串,第二個元素是括號中的匹配到的內(nèi)容。如果有多個括號,會依次保存在結(jié)果數(shù)組中
但是如果在括號里面前綴 ?:,表示不保存匹配內(nèi)容
m = s.match(/(?:_)[a-z0-9]+?/)
// ["_b"]
結(jié)果只有整個
// 不一定需要用(?:)不捕獲。
let str = "a_b_2_d_1";
str.split('_'); // ["a", "b", "2", "d", "1"]。不取a即可
推薦兩個網(wǎng)址:
可以用 在線正則圖形化驗證你寫的正則%5Ba-z0-9%5D%2B),這樣看的更明白些
在線正則驗證
// 如果要匹配`_`后面的字母或數(shù)字。
let str = "a_b_2_d_1-&90989";
let resultArr = str.match(/_([0-9a-z]+)/g); // ["_b", "_2", "_d", "_1"]。再對結(jié)果做map操作
let result = resultArr.map(el => {
return el.slice(1);
});
console.log(result); // ["b", "2", "d", "1"]北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。