【发布时间】:2013-10-10 21:11:26
【问题描述】:
我目前正在使用正则表达式编写词法分析器,如本文所述:Poor man's "lexer" for C#
虽然它比我已经拥有的要快得多,但我只是不喜欢每个文件仍然需要大约 500 毫秒(使用秒表在 100x36k 令牌的循环中计时)。
在移动我的令牌的优先级之后,我已经将 500 毫秒减少了一半,并且通过向我的大多数令牌添加一个“简单匹配”布尔值(这基本上意味着它应该使用一个简单的string.Contains(Ordinal) 而不是 Regex.Match)。
为了获得最佳性能,我显然想摆脱大部分(如果不是全部)Regex.Match 调用。为此,我需要在正则表达式中模拟 \b 标记的东西,也称为单词边界(意味着它应该只匹配整个单词)。
虽然我可以写一个简单的方法来检查我的“简单匹配”之前和之后的字符是否是非单词字符,但我想知道 .NET 是否有这个内置的东西?
如果我最终不得不编写自己的方法,最好的方法是什么?在我的单词之后选择字符的索引并检查它的字节值是否低于任何值?任何有关这方面的提示也将受到欢迎!
【问题讨论】:
-
请注意,
\b仅当您的单词由字母、数字和下划线组成时才匹配单词边界。对于所有其他情况,它是无用的。 -
我知道,但感谢您的提醒!只要我模拟
\b的确切行为,我的词法分析器就会产生我期望的确切输出。 -
你在预编译你的正则表达式吗?这可以加快正则表达式匹配。此外,this question 可能会提供一些关于为什么您的正则表达式可能需要更长的处理时间的见解。不看你的表情很难知道。
-
我正在使用正则表达式进行解析并获得比这更好的性能。我第二你是在预编译正则表达式吗?
-
Compiled标志对性能的影响绝对为零。正如我在问题中描述的那样,我继续实施了\b替代方案。只剩下 4 个表达式,我怀疑CompileToAssembly会为我带来很多性能,因为我已经下降到 120 毫秒(从原来的 500 毫秒)。
标签: c# .net regex performance