![]() |
1
7
使用正则表达式操纵文本的一个很好的特性是模式是高级的和声明性的。这为实现留下了相当大的优化空间,例如分解出最长的公共前缀或使用 Boyer-Moore 对于静态字符串。简洁的符号便于专家快速阅读。我马上明白了什么
正在做,而且
正则表达式的重要考虑因素不是下限,而是 上限 |
![]() |
2
9
谁说正则表达式很慢?至少在Perl中,它们往往是操纵字符串的首选方法。 proper email validation regex 长度超过6000个字符,它甚至不能处理所有的情况(你必须首先去掉注释)。 至少在Perl5中,如果它有语法,可能不应该用一个正则表达式来解析它。 如果regex已经增长到无法再轻松维护的程度(请参阅前面的电子邮件验证示例),或者评测显示regex是代码中的慢组件,那么还应该将regex重写为自定义函数。 您似乎关心regex与自定义算法的速度,但在您使用探查器证明这一点之前,这并不是一个有效的关注点。以最易维护的方式编写代码。如果正则表达式是清晰的,那么使用正则表达式。如果自定义算法是明确的,则使用自定义算法。如果在评测代码后发现其中一个正在占用大量时间,那么就开始寻找替代方案。 |
![]() |
3
3
正则表达式永远不会比手工算法更快,因为它有着非常特殊的用途。更糟糕的是,在PHP中,它们必须在第一次使用时进行编译(之后使用缓存)。
我们强烈建议您了解正则表达式是如何实现的,这样您就可以知道何时编写低效的正则表达式。 |
![]() |
4
3
然而,正则表达式速度慢的情况是 excessive backtracking occurs 通常可以重写正则表达式以获得更好的性能。但最终的性能将是为特定任务编写自己的优化解析器。例如,通过编写自己的解析器,您可以在维护内存(或状态)的同时从左到右进行解析。如果在过程代码中使用此技术,通常可以在一次过程中实现所需的效果,而不会出现回溯的缓慢情况。 今年早些时候我面临着这个决定。事实上,手头的任务甚至是在正则表达式的外围。最后,我决定编写自己的解析器,一个嵌入式下推自动机,它对我所要做的事情非常有效。顺便说一句,任务是构建一些能够解析正则表达式并为它们提供类似Intellisense的代码提示的东西。 http://blog.regexhero.net/2010/03/code-hinting-for-regular-expressions.html |
![]() |
5
3
容易的。
每次你问自己这样一个问题时,提醒自己在默认情况下,所有额外优化和超快速的代码都会在每个用户请求时被逐字符解析,这是非常有用的。没有破解大脑的regexp,没有狡猾的字符串操作,只是一个接一个的老好人。 |
![]() |
6
1
正则表达式并不慢。但是实现可能会很慢,主要是因为每次使用它们时都会对其进行解释和重新构建。但是好的regexp库允许您使用编译版本。他们跑得很快。 |
![]() |
Manny · 如何比较Perl中的字符串? 2 年前 |
![]() |
BioRod · 我不能用Perl打印键和值 2 年前 |
![]() |
user17227456 · Perl CLI代码无法追加字符串行 2 年前 |
![]() |
LearnToBeBetter · 读取文件,搜索字符串,打印字符串 2 年前 |
![]() |
KJ7LNW · 一些波斯语文本的宽字符印刷,但其他文本则没有 2 年前 |
![]() |
con · 如何搜索大型数据结构并返回一系列给出特定值的键/数组? 2 年前 |
![]() |
Pranay Nanda · 使用regex解析许可证文件 6 年前 |