Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Javascript中不支持lookbehind断言?_Javascript_Regex - Fatal编程技术网

为什么Javascript中不支持lookbehind断言?

为什么Javascript中不支持lookbehind断言?,javascript,regex,Javascript,Regex,最近我(有些尴尬地)意识到,regexlookback断言在Javascript中是不可能的 这种说法如此普遍的(事实)原因是什么? ,尽管禁止功能的是工作中的基本语义,还是确切地说是什么 另外,一些从正则表达式模式生成Javascript代码的人似乎忽视了这一事实——这让我觉得有点奇怪。今天 “回头看”现在是该网站的官方部分。Axel Rauschmayer给出了一个建议 历史 (因为Netscape是在较旧版本的Perl上构建的): 这是1998年,我在1997年做的Netscape 4工作

最近我(有些尴尬地)意识到,regex
lookback断言在
Javascript
中是不可能的

这种说法如此普遍的(事实)原因是什么?

,尽管禁止功能的是工作中的基本语义,还是确切地说是什么

另外,一些从正则表达式模式生成Javascript代码的人似乎忽视了这一事实——这让我觉得有点奇怪。

今天 “回头看”现在是该网站的官方部分。Axel Rauschmayer给出了一个建议

历史 (因为Netscape是在较旧版本的Perl上构建的):

这是1998年,我在1997年做的Netscape 4工作是基于Perl 4(!),但我们建议ECMA TC39 TG1(JS组——当时情况不同,包括大写)基于Perl 5的东西。我们没有得到所有的东西,我们不得不为一些明显的怪癖找理由

我不记得lookbehind(1998年7月出现在Perl5.005中)被故意忽略了。Waldemar可能还记得更多,我把netscape.com里面的JS密钥交给了他,让他去做mozilla.org

如果你想写一个建议或小规格(甚至是ES5的风格),让我知道。下周我会和其他TC39的人聊聊这件事

/是

邮件列表中有许多不同的功能试图包含它,但从性能角度来看,它似乎仍然是一个相当复杂的功能,因为在处理捕获组时,基于对象的回溯需要回溯。这可能会导致一些问题,如使用不当

在某种程度上,有人建议将其用于ES6/Es 2015,但它从未制定过草案,更不用说规范了。在过去,似乎没有人承担起实施这项计划的任务。如果有人觉得有必要编写一个实现,他们可以注册并提出它

2015年5月更新: 2015年5月

2015年9月更新: 将Regex Look behind添加为一个

2017年5月更新:
。这意味着现在至少有两个浏览器需要实现它,它才能成为下一个EcmaScript标准的一部分。正如@martixy在评论中提到的,.

从结论来看,我认为look-behind没有用JavaScript实现,因为没有人知道它应该如何运行,现有的实现表明添加对look-behind的支持相当复杂

JavaScript/ECMAScript与其他语言的不同之处在于,规范中包含了正则表达式引擎的抽象实现,而大多数其他语言只在描述正则表达式语法的每一部分的行为方面做得不够,很少描述不同的标记如何相互作用

向前看?易于实现 “前瞻”的实施相当直接。您只需要以与外部前瞻模式相同的方式处理前瞻内部的模式,并按照通常的方式执行从左到右的匹配,除了在前瞻成功后1)在进入前瞻之前恢复当前位置,以及2)在匹配后放弃前瞻内部的选择点

“前瞻”中可以包含的内容没有限制,因为它是对现有自然从左到右匹配设施的一个非常简单的扩展

回头看?不那么容易 另一方面,后顾之忧的实施并不那么直接

想象一下,您将如何实现以下look-behind构造:

(?<=fixed-string)
(?<=a|fixed|string)
(?<=t[abc]{1,3})
(?<=(abc){2,6})
(?<=^.*abc.*)
(?<=\G"[^"]+");
(?<=^(.....|.......)+)
\b(\w+)\b(?<!\b\1\b.*\1)

(?您已经在regex101.com上选择了PCRE flavor。选择JS,您会得到一个错误:。此外,look behinds太消耗资源了,我认为这是JS不支持它们的唯一原因。IMO最好的look behind解决方法是:JS不支持lookbehinds是一个主要的PITA-但这不是它唯一的问题;JS是最不支持的问题之一不幸的是,这是基于意见的,因为我认为只有来自ECMA的人才能用导致这一决定的真正理由回答这个问题。:-\Regex101确实警告过你关于
回头看
。你prabaly没有选择
javascript
@Lucastrezesniewski:我真的认为你和stribizhev提到的是非常合法的-这很有意义。我发现了关于Waldemar实现的最后一件事。从它的声音中,没有人会帮助实现它…基本上是为什么它从未被放入。MSDN链接与look behind断言有什么关系?loo怎么可能k-behind会导致灾难性回溯?@vks:根据实现情况,可变长度回溯可能不会导致回溯。灾难性回溯通常是由模式的其他部分引起的。@Stribizev:当然,您可以引用它,但它是否与手头的问题有关?我找不到它说的是look-behind.@nils:lookbehind(或任何lookaround)内部的模式永远不会回溯到--这意味着一旦退出环顾,就不会再回溯到环顾内部,而是在环顾之前。然而,在验证环顾的过程中,除了在模式内部进行的回溯之外,环顾本身可能会通过回溯来实现,也可能不会。V8 p中的好人roject已经实现了这个特性。几天前,它在实验JavaScript标志后面的稳定ChromeV49中可用。()感谢您的见解/解释。因此,如果我正确理解您的答案,似乎整个
Javascript
处理
regex
的方式都有点低效,因此他们不太可能实现lookbehind断言?