为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白猪掌柜的 2018-11-14 13:14:21
这种字符串var d = "1【ddd】sfdsaf【ccc】fdsaf【bbbb】"; 我想得到【和】之间的字符串数组如何用一个正则搞定?不包括两个括号目前我自己只能做到带括号的var d = "1【ddd】sfdsaf【ccc】fdsaf【bbbb】"; var patt = /\【[^\】]+\】/g; d.match(patt)
查看完整描述

1 回答

?
FFIVE

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

查看完整回答
反对 回复 2018-12-08
  • 1 回答
  • 0 关注
  • 1671 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信