gpt4 book ai didi

c# - 正则表达式性能优化

转载 作者:行者123 更新时间:2023-11-30 20:43:53 24 4
gpt4 key购买 nike

所以,我有以下用于语法高亮显示的正则表达式:

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);

它可以满足我的要求,但是当涉及到大约 200,000 个字符的大文件时,它需要 6 秒多一点。

是否有提高性能的方法?

编辑:仔细查看所有评论/答案/提示后,我现在有了这个:

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 秒内处理 200,000 个字符长的文本。这是更好的。不过,我会继续做一些测试,看看是否可以进一步缩短时间。

最佳答案

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

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

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

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]) 紧接在第一个单词边界之后 (请记住,单词边界可以在单词字符位置或非单词字符位置成功)。目的是避免在单词边界位置没有感兴趣的字母时测试交替。

关于c# - 正则表达式性能优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30037700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com