返回 Javascript 中正则表达式 match() 的位置?

IT技术 javascript regex match string-matching
2021-01-21 22:25:05

有没有办法在 Javascript 中检索正则表达式 match() 结果字符串中的(起始)字符位置?

6个回答

exec返回一个具有index属性的对象

var match = /bar/.exec("foobar");
if (match) {
    console.log("match found at " + match.index);
}

对于多个匹配项:

var re = /bar/g,
    str = "foobarfoobar";
while ((match = re.exec(str)) != null) {
    console.log("match found at " + match.index);
}

@OnurYıldırım - 删除g标志,它会工作。由于match是字符串的函数,而不是正则表达式exec,因此它不能像 那样有状态,因此exec如果您不寻找全局匹配,它只会像对待它(即具有索引属性)一样对待它......因为然后有状态并不重要.
2021-03-26 22:25:05
@OnurYıldırım - 这是它的一个 jsfiddle 工作......我一直在测试它回到 IE5......效果很好:jsfiddle.net/6uwn1vof
2021-04-03 22:25:05
@JimboJonny,嗯,我学到了一些新东西。我的测试用例返回undefined. jsfiddle.net/6uwn1vof/2 这不是像你这样的类似搜索的例子。
2021-04-03 22:25:05
谢谢你的帮助!你能告诉我如何找到多个匹配项的索引吗?
2021-04-11 22:25:05
注意:使用re作为变量和添加g修饰符都很重要!否则你会陷入无限循环。
2021-04-11 22:25:05

这是我想出的:

// Finds starting and ending positions of quoted text
// in double or single quotes with escape char support like \" \'
var str = "this is a \"quoted\" string as you can 'read'";

var patt = /'((?:\\.|[^'])*)'|"((?:\\.|[^"])*)"/igm;

while (match = patt.exec(str)) {
  console.log(match.index + ' ' + patt.lastIndex);
}

match.index + match[0].length 也适用于结束位置。
2021-03-22 22:25:05
@BeniCherniavsky-Paskin,最终位置不是match.index + match[0].length - 1吗?
2021-03-29 22:25:05
@David,我的意思是排他性的结束位置,例如.slice().substring()如您所说,包容性结束将减少 1。(请注意,包含通常意味着匹配中最后一个字符的索引,除非它是一个空匹配,它匹配之前为1并且可能-1完全在字符串之外以在开始时为空匹配......)
2021-03-30 22:25:05
因为patt = /.*/它无限循环,我们如何限制它?
2021-04-02 22:25:05
真的很好 -比较在这里
2021-04-03 22:25:05

来自developer.mozilla.org文档关于 String.match()方法:

返回的 Array 有一个额外的输入属性,它包含被解析的原始字符串。此外,它还有一个 index 属性,表示 string 中匹配项的从零开始的索引

在处理非全局正则表达式时(即,g正则表达式上没有标志),返回的值.match()有一个index属性……您所要做的就是访问它。

var index = str.match(/regex/).index;

这是一个示例,显示它也能正常工作:

var str = 'my string here';

var index = str.match(/here/).index;

console.log(index); // <- 10

我已经成功地测试了这一点,一直回到 IE5。

在现代浏览器中,您可以使用string.matchAll()完成此操作

这种方法 vs 的好处RegExp.exec()是它不依赖于有状态的正则表达式,如@Gumbo's answer

let regexp = /bar/g;
let str = 'foobarfoobar';

let matches = [...str.matchAll(regexp)];
matches.forEach((match) => {
    console.log("match found at " + match.index);
});

您可以使用对象search方法String这仅适用于第一场比赛,否则将按照您的描述进行。例如:

"How are you?".search(/are/);
// 4