如何检查子字符串的 CONTEXT 是否与 JavaScript 中的正则表达式匹配?



我有许多输入对可以使用JavaScript在文本中搜索。每对由一个短字符串(假设cc)和它应该在的上下文(比如[^d]cc[^d])组成。我想在文本中找到匹配项,但这并不像使用indexOf([^d]cc[^d])那样简单,因为这不将子字符串作为参考。

例如,如果文本是1cccd我应该得到2作为输出,但'1cccd'.indexOf([^d]cc[^d])给出1,因为这是它找到[^d]的位置(正则表达式的开头)。

我尝试过类似'1cccd'.replace([^d]cc[^d], '$&').slice(i).indexOf('cc') == 0的东西(i通过文本前进),但这报告了cc的所有实例,无论上下文如何。

然后,我尝试使用match中的捕获组来检查子字符串左侧的字符数:var tmp = '1cccd'.match(([^d])cc[^d]); return tmp.index+tmp[1].length;。但我无法将其定向到搜索区域,因为match不会从正则表达式中获取lastIndex。另一方面,exec确实会接受lastIndex,但不能使用捕获组。(编辑:exec可以使用捕获组,如答案所示)

使用lookbehind似乎是答案,但JavaScript不支持这些。

有没有办法检查给定位置的子字符串是否在给定上下文中,如正则表达式指定的那样?

这里的一种方法是匹配捕获目标模式,包括字符串的其余部分,直到最后。 然后,使用indexOf(偏移量)的起始标记字符,以查找实际匹配发生位置的索引。

var input = "1cccd";
var regexp = /^.*([^d])(cc[^d].*)$/g;
var match = regexp.exec(input);
console.log(match[1]);
console.log(input.indexOf(match[2]));

这里的诀窍是match[1]包含匹配以及随后的所有内容。 因此,使用它对输入进行indexOf查找应该只解析为一件事,即匹配。 我偏移了 1,因为我们在cc之前还捕获了一个非数字字符。 您可以调整此偏移量以匹配图案前的标记字符数。

最新更新