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 下无法执行。
添加回答
举报