在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  HTML/ 正則里的match不能與(?:)一起用嗎?

正則里的match不能與(?:)一起用嗎?

某一個字符串為'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是與(?:)不生效呢,還是為什么。
如果不用這種方式還能怎么寫呢?

回答
編輯回答
萢萢糖
  1. 你可以去查下match的用法,match根據(jù)正則表達式里面有沒有全局匹配g,會返回不同的結(jié)果,如果不是全局匹配,那么返回的結(jié)果是數(shù)組,第一個元素是匹配的完整字符串,從第二個元素開始是捕獲型括號的內(nèi)容;如果是全局匹配,返回的結(jié)果是一個數(shù)組,數(shù)組的每個元素都是匹配的完整字符串,沒有捕獲型括號的內(nèi)容。

  2. 使用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)
2017年10月7日 00:57
編輯回答
櫻花霓

str.match(/(?!a)[a-z0-9]+/g)

2017年5月28日 07:35
編輯回答
司令

如果你是說不抓取第一個字母可以用

let str = "a_b_2_d_1"
let result = str.match(/\B[a-z0-9]+/gi);

如果是不抓取a

let str = "a_b_2_d_1"
let result = str.match(/[b-z0-9]+/gi);
2018年7月5日 04:39
編輯回答
裸橙

我覺得你是想用零寬斷方。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é)果只有整個

2017年4月1日 23:39
編輯回答
薔薇花
// 不一定需要用(?:)不捕獲。
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"]
2017年7月14日 11:15