1 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
非常簡單,用零寬斷言:
const d = "1【ddd】sfdsaf【ccc】fdsaf【bbbb】"; d.match(/[^【]+(?=】)/g);
上面只用了零寬度正預(yù)測先行斷言,實(shí)際上如果 不限于JavaScript的話 是新版 Chrome、新版 Node.JS 的話,還可以寫成
(?<=【).+?(?=】)
零寬斷言分為兩類四種:
正向零寬斷言
零寬度正預(yù)測先行斷言(?=exp)
表示自身位置之后可以匹配到exp的表達(dá)式,而不匹配exp。
比如\d+(?=999)
表示以999結(jié)尾的數(shù)字串(但是匹配結(jié)果不包含999)
零寬度正回顧后發(fā)斷言(?<=exp)
(JavaScript不支持 新版 Chrome、新版 Node.JS 支持,F(xiàn)irefox 至今不支持,其他未測試)
表示自身位置之前可以匹配到exp的表達(dá)式,而不匹配exp。
比如(?<=999)\d+
表示以999開頭的數(shù)字串(但是匹配結(jié)果不包含999)
負(fù)向零寬斷言
零寬度負(fù)預(yù)測先行斷言(?!exp)
表示自身位置之后不能是exp的表達(dá)式。
比如\d+(?!999)
表示匹配不是以999結(jié)尾的數(shù)字串
零寬度負(fù)回顧后發(fā)斷言(?<!exp)
(JavaScript不支持 新版 Chrome、新版 Node.JS 支持,F(xiàn)irefox 至今不支持,其他未測試)
表示自身位置之前不能是exp的表達(dá)式。
比如(?<!999)\d+
表示匹配不是以999開頭的數(shù)字串
舉個(gè)例子
const str = '~~~%ABC%~~~DEF~~~%GHI~~~JKL%~~~';
console.log('左右都有 % 的三個(gè)連續(xù)字母(ABC):', str.match(/(?<=%)\w{3}(?=%)/g));
console.log('左右都沒有 % 的三個(gè)連續(xù)字母(DEF):', str.match(/(?<!%)\w{3}(?!%)/g));
console.log('僅左邊有 % 的三個(gè)連續(xù)字母(GHI):', str.match(/(?<=%)\w{3}(?!%)/g));
console.log('僅右邊有 % 的三個(gè)連續(xù)字母(JKL):', str.match(/(?<!%)\w{3}(?=%)/g));
在新版 Chrome 下可以得到結(jié)果:
左右都有 % 的三個(gè)連續(xù)字母(ABC): ["ABC"]
左右都沒有 % 的三個(gè)連續(xù)字母(DEF): ["DEF"]
僅左邊有 % 的三個(gè)連續(xù)字母(GHI): ["GHI"]
僅右邊有 % 的三個(gè)連續(xù)字母(JKL): ["JKL"]
在 Firefox 或是舊版 Chrome 下無法執(zhí)行。
添加回答
舉報(bào)