JavaScript正则表达式异常(无效组)

24

我有以下正则表达式:

/(?<={index:)\d+(?=})/g

我正在尝试找到像这样的字符串中的索引整数:

some text{index:1}{id:2}{value:3}

这个表达式在php中运行良好,但在javascript中不起作用,我收到以下错误:

Uncaught SyntaxError: Invalid regular expression: /(?<={index:)\d+(?=})/: Invalid group

我需要怎么修复?

谢谢。


1
尝试转义你的花括号。 - drudge
@jnpcl 我刚刚尝试了一下,出现了Uncaught SyntaxError: Invalid regular expression: /(?<=\{index:)\d+(?=\})/: Invalid group这个错误,除非还有其他转义大括号的方法,否则无法正常运行。 - Maksim Vi.
3个回答

58

(?<= ) 是一个正向回顾后断言。JavaScript的RegEx不支持回顾后断言(但支持前瞻断言)。


8
事实上,正向先行断言已正式成为 JS 正则表达式规范的一部分(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#assertions),但截至发文时只有 Chromium 支持(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#Browser_compatibility)。 - webbower
1
如何进行替换并获得相同的行为? - César Castro Aroche
如果其他方法都不起作用,你可以反转字符串,使用正向预查进行反向正则表达式匹配,并反转结果。但这可能不适用于你遇到的问题。 - undefined

11

JavaScript不支持向后查找断言。请使用以下模式:

/{index:(\d+)}/g

然后提取捕获组中的值。


它提取了整个东西,而我只需要一个整数。 - Maksim Vi.
请注意\d+周围的括号;整数被捕获在第一组中。 - Alan Moore
@Alan Moore,也许我做错了什么,但是"some text{index:1}{id:2}{value:3}".match(/{index:(\d+)}/g)[0]返回{index:1},而"some text{index:1}{id:2}{value:3}".match(/{index:(\d+)}/g)[1]返回'undefined'。 - Maksim Vi.

5
var str = "some text{index:1}{id:2}{value:3}";
var index = str.match(/{index:(\d+)}/);
index = index && index[1]*1;

啊,我明白了,没有/g确实有帮助 =) - Maksim Vi.

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