1 回答

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