我有许多输入对可以使用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
之前还捕获了一个非数字字符。 您可以调整此偏移量以匹配图案前的标记字符数。