一种在javascript regexp中捕获多个变量的简单方法

时间:2015-03-27 01:10:00

标签: javascript regex node.js

来自perl / python世界我想知道是否有一种更简单的方法可以在javascript中从regexp过滤掉多个捕获的变量:

#!/usr/bin/env node  
var data=[
  "DATE: Feb 26,2015",
  "hello this should not match"
];

for(var i=0; i<data.length; i++) {
  var re = new RegExp('^DATE:\\s(.*),(.*)$');
  if(data[i].match(re)) {
    //match correctly, but how to get hold of the $1 and $2 ?
  }
  if(re.exec(data[i])) {
    //match correctly, how to get hold of the $1 and $2 ? 
  }

  var ret = '';
  if(data[i].match(re) && (ret = data[i].replace(re,'$1|$2'))) {
    console.log("line matched:" + data[i]);
    console.log("return string:" + ret);
    ret = ret.split(/\|/g);
    if (typeof ret !== 'undefined') {
      console.log("date:" + ret[0], "\nyear:" + ret[1]);
    }
    else {
      console.log("match but unable to parse capturing parentheses");
    }
  }
}

最后一个条件有效,但你需要一个临时变量并将其拆分,你需要在前面进行测试,因为替换适用于所有事情。

输出是:

$ ./reg1.js 
line matched:DATE: Feb 26,2015
return string:Feb 26|2015
date:Feb 26 
year:2015

如果我抬头:mosdev regexp它在(x)上说:

  

可以从生成的数组中调用匹配的子字符串   元素1,...,[n]或来自预定义的RegExp对象   物业$ 1,...,$ 9。

如何掌握RegExp对象&#39; $ 1和$ 2?

由于

3 个答案:

答案 0 :(得分:3)

MDN是学习Javascript的好资源。在这种特殊情况下,.match().exec()等都返回包含匹配信息的对象。那是你可以找到被捕获的团体的地方。

答案 1 :(得分:0)

感谢您的回答,他们返回了一个数组:,所以更简单的块看起来像这样:

  if((ret = data[i].match(re))!=null) {
    //match correctly, but how to get hold of the $1 and $2 ?
    console.log("line matched:" + data[i]);
    console.log("return string:" + ret[0] + "|" + ret[1]);
    ret = null;
  }
  if((ret = re.exec(data[i]))!=null) {
    //match correctly, how to get hold of the $1 and $2 ?
    console.log("line matched:" + data[i]);
    console.log("return string:" + ret[0] + "|" + ret[1]);
    ret = null;
  }

答案 2 :(得分:0)

使用JavaScript .test().match()这可能非常简单

一个例子:

var input = "DATE: Feb 26, 2015",
    regex = /^DATE:\s*(.*),\s*(.*)$/;

if (regex.match(input)) {
    console.log('Matches Format!');

    //.match() needs splicing because .match() returns the actually selected stuff. It becomes weirder with //g  
    var results = input.match(regex).splice(0,1);

    console.log(results);
    //Logs: ["Feb 26", "2015"]
}

Regex101可能很有用