首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex性能优化

Regex性能优化
EN

Stack Overflow用户
提问于 2015-05-04 18:48:44
回答 1查看 241关注 0票数 2

因此,我有以下用于语法突出显示的Regex:

代码语言:javascript
复制
static Regex cKeyWords = new Regex("(\t|\r\n|\\s|\\(|\\)|^)(auto|break|c(ase|har|onst|ontinue)|d(efaut|ouble)|e(lse|num|xtern)|f(loat|or)|goto|i(f|nt)" +
                                        "|long|re(gister|turn)|s(hort|igned|izeof|tatic|truct|witch)|typedef|u(nion|nsigned)|v(oid|olatile)|while)(?=\t|\r\n|\\s|\\(|\\)|{|}|$)", RegexOptions.Compiled);

它可以做我想做的事情,但是当涉及到大约2000个字符的大型文件时,它需要6秒多一点的时间。

是否有提高性能的方法?

编辑:在仔细查看了所有评论/答案/技巧之后,我现在有了以下内容:

代码语言:javascript
复制
static Regex cKeyWords = new Regex(@"\b(?:
    s(?:hort|i(?:gned|zeof)|t(?:atic|ruct)|witch) | c(?:ase|har|o(?:nst|ntinue)) |
    e(?:lse|num|xtern) | i(?:f|nt) | f(?:loat|or) | d(?:efault|ouble) | un(?:ion|signed) |
    re(?:gister|turn) | vo(?:id|latile) | while | break | long | typedef | auto | goto
    )\b",
    RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace);

这个可以在5.5秒内处理2000个字符的长文本。这样好多了。不过,我会继续做一些测试,看看能否进一步缩短时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-04 20:03:32

在我看来,开头的(\t|\r\n|\\s|\\(|\\)|^)和结尾的(?=\t|\r\n|\\s|\\(|\\)|{|}|$)都是无用的,可以用单词边界来代替相同的结果。(使用交替启动模式是您应该避免的最糟糕的事情之一,因为regex引擎必须测试字符串中的每个位置,在最坏的情况下必须使用所有选项)

只在需要时使用捕获组,因为它们不需要使用内存和时间。在目前的情况下,你根本不需要它们。

所以你可以像这样重写你的模式:

代码语言:javascript
复制
static Regex cKeyWords = new Regex(@"\b(?:
    auto | break | c(?:ase|har|onst|ontinue) | d(?:efaut|ouble) |
    e(?:lse|num|xtern) | f(?:loat|or) | goto | i(?:f|nt) | long |
    re(?:gister|turn) | s(?:hort|igned|izeof|tatic|truct|witch) | typedef |
    un(?:ion|signed) | vo(?:id|latile) | while )\b",
     RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace);

注意,关键字现在在组0中(整个匹配)。

其他你可以尝试的事情:

  • 尝试更多地分解,例如:c(?:ase|har|on(?:st|tinue))等。
  • 试着完全不分解。
  • 尝试按概率对备选方案进行排序(例如,有更多以"s“开头的单词,因此您可以尝试将s(?:hort|igned|izeof|tatic|truct|witch)放在首位。
  • 试着按最常用的关键字对备选方案进行排序。
  • 尝试添加(?=[a-gilr-w]) (所以所有关键字的第一个字母),或者至少在第一个单词边界之后立即添加(?=[a-z]) (请记住,单词边界可以在单词字符位置或非单词字符位置成功)。目的是避免在单词边界位置没有有趣的字母时测试替换。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30037700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档