Javascript字符串匹配特定的正则表达式

时间:2019-05-13 11:03:04

标签: javascript regex

我要匹配此变量中的特定字符串。

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"
 ]

4 个答案:

答案 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组(可选):在字符串开头出现+skipskip的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)