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

4

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

例如:

var string = "505 Swanton St";

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

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

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


1
如果您只想将其存储在变量中,可以使用replace并捕获与字符串参数$``(一个反引号:我无法让SO仅显示一个)匹配的内容之后的所有内容,例如:var string =“505 Swanton St”; var after = string.replace(/\d+/g,“$`”); console.log(after);//Swanton St - 1252748
2个回答

9

你可以使用捕获组来捕获模式之前和之后的所有内容:

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));


啊,太好了。谢谢。 - Raphael Rafatpanah

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函数,使其也能获取最后一次匹配后的余数 *

1
哎呀,我发现函数中有一个错误,它没有返回最后一次匹配后的字符串部分。"1a2b3c" 返回了一个剩余部分 "ab"。我已经修复了它。 - Domino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接