js正则表达式求两个字符之间的字符串

这种字符串
var d = "1【ddd】sfdsaf【ccc】fdsaf【bbbb】";
我想得到【和】之间的字符串数组
如何用一个正则搞定?
不包括两个括号
目前我自己只能做到带括号的

var d = "1【ddd】sfdsaf【ccc】fdsaf【bbbb】"; 
var patt = /\【[^\】]+\】/g; 
d.match(patt)

===========

d.replace(/\【[^\】]+\】/g, ($0, $1) {
    // $0是带【】的匹配
    // $1是不带【】的匹配
})
阅读 12.9k
5 个回答

非常简单,用零宽断言

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 下无法执行。

var d = "1【ddd】sfdsaf【ccc】fdsaf【bbbb】"; 
var patt = /\【([^\】]+)\】/g; 
var arr = [];
d.replace(patt,function($0,$1){arr.push($1)});

参考 @hack_qtxz 使用replace实现。

var d= "1【ddd】sfdsaf【ccc】fdsaf【bbbb】"; 
var patt = /\【([^\】]+)\】/g; 
var result = d.replace(patt, ($0, $1)=>',!' + $1 + ',').split(',').filter(v=>-1 != v.indexOf('!')).map(v=>v.substr('1'));
console.log(result);

以下使原答案:

@舒克 答案有点重复了,在换一个写法。

var d= "1【ddd】sfdsaf【ccc】fdsaf【bbbb】"; 
var patt = /\【[^\】]+\】/g; 
var result = d.match(patt).map(v => v.substr(1, v.length-2));
console.log(result);

以下是原答案:

var d= "1【ddd】sfdsaf【ccc】fdsaf【bbbb】"; 
var patt = /\【([^\】]+)\】/g; 

var matches;
var result = [];
while ( !!(matches = patt.exec(d)) ) {
    result.push(matches[1]);
}
console.log(result);

引用 @cipchk 给你补全代码吧。

var d = "1【ddd】sfdsaf【ccc】fdsaf【bbbb】";
var myregexp = /【([^】]+)/g;
var result;
while ((result = myregexp.exec(d)) != null) {
    console.log(result[1])
}
var myregexp = /【([^】]+)/g;
var match = myregexp.exec(subject);
while (match != null) {
    // matched text: match[0]
    // match start: match.index
    // capturing group n: match[n]
    match = myregexp.exec(subject);
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题