我有一个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
答案 0 :(得分:3)
'RegEx'和'Fast'不能一起使用,简单的字符串split / substring比使用常规espressions更快。
来自MSDN: http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions.aspx
Regex.Compiled:
指定将正则表达式编译为程序集。这个 产生更快的执行但增加启动时间。这个值应该 调用时不会分配给Options属性 CompileToAssembly方法。
当您指定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