使用正则表达式快速解析数据

时间:2013-10-20 06:03:44

标签: .net regex vb.net

我有一个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

2 个答案:

答案 0 :(得分:3)

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

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

  

Regex.Compiled:

     

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

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

  

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

     

问题是将正则表达式编译为动态   汇编需要很长时间,所以第一次使用Regex对象   使用Compiled选项创建,需要很长时间。   对Match()或Replace()的后续调用将执行一点   比非编译的正则表达式更快。<​​/ p>      

预编译正则表达式仅在创建Regex对象时有用   在您的应用程序的早期,并经常重复使用它。

我不是专家,但我认为你做的不仅仅是为了尝试使用正则表达式来提高速度,可能使用流编写调试信息可能会“更快”地显示它(但可能是第二个或更少的差异)。

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

 Private Function ParseData2(...) As Integer

匹配变量的类型:

 Dim matches As MatchCollection = r.Matches(strData)

同样在VB中,所有东西都从0开始计数,而不是从1开始,你可能想考虑使用它:

 Dim i As Integer = 0

答案 1 :(得分:0)

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

match.Captures["Digits"].Length

点击此处http://blogs.msdn.com/b/ericgu/archive/2006/03/06/544553.aspx