JavaScript正则表达式与Perl正则表达式的比较

40

当谈到正则表达式时,我只是一个新手。我知道Perl在正则表达式方面很棒,但我对Perl不太了解。最近开始学习JavaScript并接触用于验证用户输入的正则表达式......还没有多少使用经验。

JavaScript的正则表达式与Perl的正则表达式相比如何?有哪些相似之处和区别?
所有在JS中编写的正则表达式都可以在Perl中使用,反之亦然吗?
语法是否相似?


1
我很好奇是否有人会回答这个问题。我知道Perl和JavaScript之间的基本正则表达式功能是相同的(^锚定左侧,$锚定右侧,\b表示单词边界等)。但是一些高级功能可能会有所不同,例如非贪婪匹配和反向引用。 - jpsimons
4个回答

31

从ECMAScript 2018开始,许多JavaScript正则表达式的缺陷已经得到修复。

仍然缺少什么:

  • JavaScript没有通过使用占有量词++/*+/?+或原子组(?>...)来防止回溯以使匹配最终的方法。
  • 不支持递归/平衡子组匹配。
  • 除此之外(美观)的一件事是,JavaScript不知道冗长的正则表达式,这可能会使它们更难读取。

除此之外,基本的正则表达式语法在两种风格中非常相似。


3
你可以通过字符串连接来伪造冗长的正则表达式。虽然不如真正的冗长正则表达式好,因此在使用时门槛更高,但它仍然是一个选项,在某些情况下绝对是值得的。 - Aaron Maenpaa
ECMAScript 2018 中已经加入了后顾断言。 - Jakob

8
这个比较将回答你所有的问题。

5
除了这份资料已经过时了约三年,因为它只涵盖了Perl 5.8,并且列表中的一些内容是在5.10版本中添加的。 - hobbs
1
@hobbs - 我们中的一些人仍然生活在5.8的世界中 :) - DVK
5
具体来说(也就是实际有帮助的),5.10 版本增加了命名捕获,命名反向引用以及使用 + 的“贪婪量词”,以及一些与回溯控制和递归下降解析相关的其他内容,这些内容在该比较中并未涉及。 - hobbs
1
我看不到任何关于Ecmascript或javascript的参考。 - EnzoR

6

另一个不同之处:在JavaScript中,没有s修饰符:点"."将永远不会匹配换行符。作为"."的替代,字符类[\s\S]可以在JavaScript中使用,它将像Perl中的/./s一样工作。


1
使用字符类[^] - resgh
4
s 修饰符已在 ECMAScript 2018 中添加。 - Jakob

0
我最近遇到了一个问题,某些版本的JavaScript无法识别\d(十进制),必须使用[0-9]。

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