热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

perl中的regex比Java或其他语言中的regex快吗?-IsregexinperlfasterthaninJavaorotherlanguages?

Ihaveheardfromtimetotimefrompeople,whosaidthatregexinPerlisfasterthaninotherlang

I have heard from time to time from people, who said that regex in Perl is faster than in other languages. Also, some online documents also say Perl has advantages when it comes to regex processing. Can you guys explain if this is true, and why?

我经常听到人们说,Perl中的regex比其他语言中的regex快。此外,一些在线文档还说,Perl在regex处理方面具有优势。你们能解释一下这是真的吗?为什么?

3 个解决方案

#1


17  

Why would you consider the speed of two engines when one of them (Java's) is notably buggy? (Search for writings by Tom "tchrist" Christiansen on the subject.) For example, \s fails to match many space characters.

为什么你要考虑两个引擎的速度,当其中一个(Java的)有明显的错误?(寻找关于这个主题的汤姆·克里斯汀森的作品。)例如,\s不能匹配许多空格字符。

Also, some online documents also say Perl has advantages when it comes to regex processing.

此外,一些在线文档还说,Perl在regex处理方面具有优势。

Here are some:

这里有一些:

  • Has many features you cannot find in other engines, either because the other engines haven't copied them yet, or because their design does not permit them to support those features.
  • 有许多你在其他引擎中找不到的特性,或者因为其他引擎还没有复制它们,或者因为它们的设计不允许它们支持这些特性。
  • Highly optimised. Many of these optimisations help to report failed matches sooner, something not covered by many benchmarks.
  • 高度优化。这些优化中的许多可以帮助您更早地报告失败的匹配,这是许多基准所不能涵盖的。
  • A leader in Unicode support. It's support is so advanced that our developers are finding problems with the Unicode standard itself and have worked to have them resolved!
  • Unicode支持方面的领导者。它的支持如此先进,以至于我们的开发人员发现Unicode标准本身存在问题,并努力解决它们!
  • Remarkly bug free.
  • 备注错误。

#2


13  

You may have a look at this benchmark. In the table, column patmch:1t gives the time on matching URL with /([a-zA-Z][a-zA-Z0-9]*)://([^ /]+)(/?[^ ]*)/, while column patmch:2t on matching URL or email with /([a-zA-Z][a-zA-Z0-9]*)://([^ /]+)(/?[^ ]*)|([^ @]+)@([^ @]+)/ (note the | operator). For the first pattern, Perl is about 10X faster than Java; for the second, they are about the same.

您可以看看这个基准。在表中,列patmch:1 t给的时间匹配的URL /([a-zA-Z][a-zA-Z0-9]*):/ /([^ /]+)(/ ?[^]*)/,而列patmch:2 t匹配的URL上和/或电子邮件([a-zA-Z][a-zA-Z0-9]*):/ /([^ /]+)(/ ?[^]*)|([^ @]+)@([^ @]+)/(注意|操作符)。对于第一个模式,Perl比Java快大约10倍;第二,它们是一样的。

In general, Perl uses a backtrack regex engine. Such an engine is flexible, easy to implement and very fast on a subset of regex. However, for other types of regex, for example when there is the | operator, it may become very slow. In the extreme case, its match speed is exponential in the length of the pattern. Another type of regex engine is based on NFA. It is harder to implement but has stable performance (quadratic at the worst IIRC) for all types of input. Russ Cox has several articles about these topics, which I like a lot.

通常,Perl使用回溯regex引擎。这样的引擎是灵活的,易于实现,并且非常快速地在regex的一个子集。但是,对于其他类型的regex,例如有|操作符时,它可能会变得非常慢。在极端情况下,它的匹配速度是模式长度的指数。另一种regex引擎基于NFA。它很难实现,但对所有类型的输入都具有稳定的性能(在最坏的情况下是二次递归)。Russ Cox有几篇关于这些话题的文章,我非常喜欢。

I don't know what types of regex engine Java is using, but from the benchmark, its performance does not seem impressive. You may also be interested in this benchmark which evaluates several C/C++ libraries on regex.

我不知道regex引擎Java使用的是什么类型,但是从基准测试来看,它的性能并不令人印象深刻。您可能还对这个基准感兴趣,它在regex上评估几个C/ c++库。

EDIT: In both benchmarks, patterns are tested against an old version of Linux Howto. The vast majority of lines do not have a match.

编辑:在这两个基准测试中,模式都是针对旧版本的Linux Howto进行测试的。绝大多数的线路都没有匹配。

About DFA vs. NFA: if I am right, a pure DFA cannot capture groups, at least not easily. Only NFA can capture groups. I heard that RE2 transform local NFA to DFA for the part of regex without group captures. I do not know if this is true.

关于DFA和NFA:如果我是正确的,一个纯粹的DFA不能捕捉组,至少不容易。只有NFA可以捕捉组。我听说RE2将本地NFA转换为DFA,作为regex的一部分,没有组捕获。我不知道这是不是真的。

On PCRE: PCRE has the same problem as Perl - inefficient given complex alternations. You may have a look at the regex-dna benchmark from the Computer Language Benchmarks Game. Versions using PCRE are all much slower than the fastest version that is using TCL (maybe PCRE is not using trie?). V8 is clearly the winner in that benchmark because it does not use backtrack. IMO, for C++ programmers, the best regex library is RE2.

在PCRE上:在复杂的交互中,PCRE与Perl同样存在效率低下的问题。您可以查看计算机语言基准游戏中的regex-dna基准。使用PCRE的版本比使用TCL的最快版本慢得多(也许PCRE没有使用trie?)V8显然是这个基准测试的赢家,因为它不使用回溯。在我看来,对于c++程序员来说,最好的regex库是RE2。

#3


12  

The point is not that Perl is or isn't faster than Java (benchmarks tests will tell you), but that regexes is really (deeply) part of the language itself. Just an example, in Perl, no need to load any module to use regex. See this relevant answer

重点不是Perl比Java快或慢(基准测试会告诉您),而是regexes实际上(非常)是语言本身的一部分。只是一个例子,在Perl中,不需要加载任何模块来使用regex。看到这个相关的答案

Ex. a Perl one-liner in a pseudo-terminal (that prints the root's shell) :

伪终端中的Perl一行程序(打印根的外壳):

perl -nE '/^root.*:([\/\w]+)$/ and say $1' /etc/passwd

How many lines do you need to do the same thing in Java ?

在Java中做同样的事情需要多少行?

Perl is de-facto the reference language for regexes. That's why so many language use PCRE engine (that means Perl Compatible Regular Expression)

Perl实际上是regexes的引用语言。这就是为什么许多语言都使用PCRE引擎(这意味着Perl兼容正则表达式)


推荐阅读
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • IB 物理真题解析:比潜热、理想气体的应用
    本文是对2017年IB物理试卷paper 2中一道涉及比潜热、理想气体和功率的大题进行解析。题目涉及液氧蒸发成氧气的过程,讲解了液氧和氧气分子的结构以及蒸发后分子之间的作用力变化。同时,文章也给出了解题技巧,建议根据得分点的数量来合理分配答题时间。最后,文章提供了答案解析,标注了每个得分点的位置。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 使用Flutternewintegration_test进行示例集成测试?回答首先在dev下的p ... [详细]
author-avatar
wang静的天空
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有