1

我有一个 12 MB 的文件,我将其数据复制到 RichTextBox1 中进行处理。完成大约需要 4 秒,但有人告诉我使用 (RegexOptions.Compiled) 使其更快,但我看不出两者之间有什么区别两个都。

Debug.Print(ParseData2(RichTextBox1.Text, "start", "end"))

这是功能,但我评论了我在哪里做测试

Function ParseData2(strData As String, ByVal sStart As String, ByVal sStop As String)
    'Dim r As New Regex(sStart & "(.*?)(" & sStop & "|$)", RegexOptions.Multiline Or RegexOptions.IgnoreCase Or RegexOptions.Compiled)
    Dim r As New Regex(sStart & "(.*?)(" & sStop & "|$)", RegexOptions.Multiline Or RegexOptions.IgnoreCase)
    Dim matches = r.Matches(strData)
    Dim i As Integer = 1
    For Each m As Match In matches
        'Debug.Print("    match #" & i & ": " & m.Groups(1).Value)
        i += 1
    Next
    Return matches.Count
End Function
4

2 回答 2

3

'RegEx' 和 'Fast' 不能一起使用,简单的字符串拆分/子字符串比使用常规 espressions 更快。

来自 MSDN:http: //msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions.aspx

正则表达式。编译:

指定将正则表达式编译为程序集。这会产生更快的执行速度,但会增加启动时间。调用 CompileToAssembly 方法时,不应将此值分配给 Options 属性。

http://social.msdn.microsoft.com/Forums/en-US/2b1dd1ad-2ea9-46df-a15a-61a40efcf113/regexoptionscompiled?forum=regexp

当您指定 RegexOptions.Compiled 选项时,框架将使用自定义方法创建一个动态程序集,该方法将处理正则表达式(正则表达式的预编译版本)。

问题在于将正则表达式编译为动态程序集需要很长时间,因此第一次使用 Compiled 选项创建 Regex 对象时,需要很长时间。随后对 Match() 或 Replace() 的调用将比未编译的正则表达式执行得快一点。

仅当您在应用程序的早期创建 Regex 对象并经常重用它时,预编译 Regex 才有用。

我不是专家,但我认为你不能做更多的事情来尝试使用正则表达式来提高速度,也许使用流来编写调试信息可以“更快”显示它(但也许一秒或更少的差异)。

但也许只是稍微改进一下代码,不要让编译器假设你可以尝试分配函数返回值的数据类型:

 Private Function ParseData2(...) As Integer

以及matches变量的类型:

 Dim matches As MatchCollection = r.Matches(strData)

同样在 VB 中,所有事物都从 0 开始计数,而不是从 1 开始计数,您可能需要考虑使用它:

 Dim i As Integer = 0
于 2013-10-20T07:25:56.760 回答
0

我不知道 RegexOptions.Compiled 但我可以问你只是计算出现次数吗?如果是这样,也许你应该试试这个

match.Captures["Digits"].Length

在此处查看更多信息http://blogs.msdn.com/b/ericgu/archive/2006/03/06/544553.aspx

于 2013-10-20T07:18:55.133 回答