Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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/0/performance/5.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
Regex 正则表达式性能优化提示和技巧_Regex_Performance_Optimization - Fatal编程技术网

Regex 正则表达式性能优化提示和技巧

Regex 正则表达式性能优化提示和技巧,regex,performance,optimization,Regex,Performance,Optimization,在阅读了一篇关于java中正则表达式优化的非常好的文章后,我想知道创建快速高效正则表达式的其他好技巧是什么 尽量少用any(dot)操作符,如果你能用其他方法来做,那就做吧,dot总会咬你的 我不确定PCRE是否是NFA,我只熟悉PCRE,但默认情况下+和*通常是贪婪的,它们将尽可能匹配以扭转这一局面使用+?和*?为了尽可能少地匹配,在编写regexp时请记住这两个子句。知道什么时候不使用正则表达式——有时候手工编码的解决方案更有效,也更容易理解 示例:假设要匹配一个可被3整除的整数。设计一个有

在阅读了一篇关于java中正则表达式优化的非常好的文章后,我想知道创建快速高效正则表达式的其他好技巧是什么

尽量少用any(dot)操作符,如果你能用其他方法来做,那就做吧,dot总会咬你的

我不确定PCRE是否是NFA,我只熟悉PCRE,但默认情况下+和*通常是贪婪的,它们将尽可能匹配以扭转这一局面使用+?和*?为了尽可能少地匹配,在编写regexp时请记住这两个子句。

知道什么时候不使用正则表达式——有时候手工编码的解决方案更有效,也更容易理解

示例:假设要匹配一个可被3整除的整数。设计一个有限状态机来实现这一点是很简单的,因此必须存在一个相应的正则表达式,但写出它并不是那么简单——我当然不愿意调试它

  • 当您需要重复分组,但不需要使用来自传统
    (捕获)
    组的捕获值时,请使用非捕获组
    (?:模式)
  • 如果适用,请使用(或非回溯子表达式)
    (?>模式)
  • 通过将正则表达式设计为在不匹配的情况下提前终止来避免类似的麻烦
  • 我制作了一个视频来演示这些技术。我从文章
    (x+x++y
    中写得非常糟糕的正则表达式开始。经过一系列优化,每次更改后都进行了基准测试,我使其速度提高了300万倍。该视频特定于.NET,但其中许多内容也适用于大多数其他regex版本:


    是的。。。但在某些数字系统中,它是微不足道的-(1)4周四周四;7(1)周四周四周四周四周四周四周四周四;7(1)周四周四周四周四周四周四周四周四周四周四周四四四7)(0 0 0124周四周四周四周四周四周四周四周四周四3 312446六十十十十九九九(2(124;5;5;5;5;12(124;5;5;8)8))你的意思是本::::((((0)代码)你认为你表示本次代码:((((((0)0)码)0)你你方)你你认为你的)你认为认为本本本((((((((((0)0)0)0)0)0)0)0)0)0 0)你你你的)你的)你认为认为本本本本次(0 0 0 0)3 3 3 3 3 3 3 3 3 3 3;31241010;6六六六(6(6;6;6;6;6;6;6(12|9)*(1 | 4 | 7))*((1 | 4 | 7)|((2 | 5 | 8)(0 | 3 | 6 | 9)*(2 | 5 | 8 |)*)*?(是的,我做了一个DFA,然后是GNFA,然后是regex:p)在没有反向引用时使用快速实现。我想提到的是,目前支持RE符号较少,但它们速度快、灵活,并具有许多有用的功能。您可以编写自己的匹配器来添加更多功能或使其更快。它们还进行自动优化,您可以看到如何使用json或基于json的图对它们进行评估。