我要匹配此变量中的特定字符串。
var string = '150-50-30-20=50+skip50-20-10-5=15+1*2*3*4=24+50-50*30*20=0+skip2*4*8=64';
这是我的正则表达式:
var string = '150-50-30-20=50+skip50-20-10-5=15+1*2*3*4=24+50-50*30*20=0+skip2*4*8=64';
var match_data = [];
match_data = string.match(/[0-9]+(?:((\s*\-\s*|\s*\*\s*)[0-9]+)*)\s*\=\s*[0-9]+(?:(\s*\+\s*[0-9]+(?:((\s*\-\s*|\s*\*\s*)[0-9]+)*)\s*=\s*[0-9]+)*)/g);
console.log(match_data);
输出将显示
[
0: "150-50-30-20=50"
1: "50-20-10-5=15+1*2*3*4=24+50-50*30*20=0"
2: "2*4*8=64"
]
我想从string
变量中匹配的结果仅仅是
[
0: "150-50-30-20=50"
1: "1*2*3*4=24"
2: "50-50*30*20=0"
]
答案 0 :(得分:2)
您可以在模式中的((?:\+|^)skip)?
之前使用(\d+(?:\s*[-*\/+]\s*\d+)*\s*=\s*\d+)
捕获组,找到每个匹配项,并且只要未定义第1组,就跳过(或忽略)该匹配项,否则,获取第2组值。
var string = '150-50-30-20=50+skip50-20-10-5=15+1*2*3*4=24+50-50*30*20=0+skip2*4*8=64',
reg = /((?:^|\+)skip)?(\d+(?:\s*[-*\/+]\s*\d+)*\s*=\s*\d+)/gi,
match_data = [],
m;
while(m=reg.exec(string)) {
if (!m[1]) {
match_data.push(m[2]);
}
}
console.log(match_data);
请注意,我在模式中添加了/
和+
运算符([-*\/+]
)。
正则表达式详细信息
((?:^|\+)skip)?
-第1组(可选):在字符串开头出现+skip
或skip
的1或0次(\d+(?:\s*[-*\/+]\s*\d+)*\s*=\s*\d+)
-第2组:
\d+
-1个以上数字(?:\s*[-*\/+]\s*\d+)*
-的零次或多次重复
\s*[-*\/+]\s*
--
,*
,/
,+
包围着0+空格\d+
-1个以上数字\s*=\s*
-=
内含0+空格\d+
-1个以上的数字。答案 1 :(得分:2)
根据您输入的字符串和数组中的预期结果,您可以仅用+
分割字符串,然后过滤掉以skip
开头的字符串,并在数组中获得预期的匹配项。
const s = '150-50-30-20=50+skip50-20-10-5=15+1*2*3*4=24+50-50*30*20=0+skip2*4*8=64'
console.log(s.split(/\+/).filter(x => !x.startsWith("skip")))
我可以建议使用正则表达式的其他类似方法,但是上面提到的使用split的方法似乎简单且足够好。
答案 2 :(得分:0)
尝试
var t = string.split('+skip');
var tt= t[1].split('+');
var r = [t[0],tt[1],tt[2]]
var string = '150-50-30-20=50+skip50-20-10-5=15+1*2*3*4=24+50-50*30*20=0+skip2*4*8=64';
var t = string.split('+skip');
var tt= t[1].split('+');
var r = [t[0],tt[1],tt[2]]
console.log(r)
答案 3 :(得分:0)
const string = '150-50-30-20=50+skip50-20-10-5=15+1*2*3*4=24+50-50*30*20=0+skip2*4*8=64';
const stepOne = string.replace(/skip[^=]*=\d+./g, "")
const stepTwo = stepOne.replace(/\+$/, "")
const result = stepTwo.split("+")
console.log(result)