如何捕获正则表达式.match()的剩余部分?

时间:2015-01-27 14:49:47

标签: javascript regex

在JavaScript中,是否可以捕获正则表达式的剩余部分.match()

例如:

var string = "505 Swanton St";

var m = string.match(/\d+/);

我可以使用m[0]访问“505”,但m's数组中没有其他元素。

有没有办法捕获string的其余部分?

2 个答案:

答案 0 :(得分:8)

您可以使用capture groups

捕捉模式前后的所有内容
var string = "505 Swanton St";

var m = string.match(/^(.*?)(\d+)(.*)$/);

下面:

m[0] == "505 Swanton St";  // the entire matched pattern
m[1] == "";                // first group
m[2] == "505";             // second group
m[3] == " Swanton St";     // third group

var string = "505 Swanton St";

var m = string.match(/^(.*?)(\d+)(.*)$/);

console.log(JSON.stringify(m));

答案 1 :(得分:3)

string.matchregexp.exec返回具有添加的index属性的特殊数组,该属性是匹配的第一个字符的索引。所以你也可以通过以下方式获得剩余部分:

var string = "505 Swanton St";
var m = string.match(/\d+/);
var remainder = string.substring(0, m.index) + string.substring(m[0].length);

如果使用带有/ g标志和regex.exec函数的正则表达式,则需要在匹配结束和下一个开头之间保持连接部分。

function parseInput(input) {
  parseInput.regex.lastIndex = 0;
  var matches = [];
  var remainder = "";
  var prevIndex = 0;

  while((match = parseInput.regex.exec(input)) !== null) {
    matches.push(match);
    remainder += input.substring(prevIndex, match.index);
    prevIndex = parseInput.regex.lastIndex;
  }

  if(matches.length) {
    remainder += input.substring(prevIndex); // after last result
    return {"matches": matches, "remainder": remainder};
  } else {
    return {"matches": null, "remainder": input};
  }
}
parseInput.regex = /\d+/g;

我用这个更复杂的正则表达式解析各种单位。如果有一个无关的小数点,我的正则表达式不会抓住它并且它将在剩余部分中,所以我可以通过简单地查找余数中的点来判断输入中是否存在错误

*编辑:修正了parseInput函数,因此它也获得了最后一次匹配后的余数*