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

3
我有许多输入对,使用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不支持这些。
是否有一种方法可以检查给定位置的子字符串是否在给定上下文中,如正则表达式指定的那样?

“但是'1cccd'.indexOf([^\d]cc[^\d])返回1” - 真的吗?我只得到了语法错误...正如我所预料的那样,因为据我所知indexOf只接受字符串参数。你从哪里得到它可以接受正则表达式呢?这是在特定的运行时环境中吗,还是...? - CBroe
1个回答

0

这里的一种方法是匹配并捕获目标模式,包括字符串剩余部分直到结尾。然后,使用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之前的单个非数字字符。您可以根据模式前的标记字符数来调整此偏移量。

谢谢你的回答,但偏移量正是问题所在。 上面的字符串和正则表达式只是示例,并且由用户输入,因此无法预测该值。 - 死老外
然后只需在单独的捕获组中捕获子字符串和整个剩余字符串。 - Tim Biegeleisen
我认为你做得很好,因为exec支持捕获组(与我上面写的相反)。当我调整你的代码以满足我所有需求时,我会进行更新(需要先弄清楚如何防止JS解析字符串变量)。 - 死老外
@死老外 如果你有自己的答案,那么你可以发布它。 - Tim Biegeleisen
好吧,我放弃寻找让JS检测用户输入反斜杠的方法(.raw()在这里无用),因此最终代码依赖于用户知道要添加额外的反斜杠来转义每个反斜杠。 - 死老外
显示剩余4条评论

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