搜索和替换整个单词,这些单词不仅可以被空格分隔
问题的出现原因:
在处理过程中,代码使用了正则表达式来搜索和替换整个单词。然而,随着数据量的增加,代码的迭代次数也增加,导致应用程序的速度变慢。例如,对于1万次迭代,代码需要大约20秒的时间。
问题的解决方法:
为了解决速度慢的问题,决定放弃正则表达式的方法,并使用了下面的代码。经过评估,发现这个函数的速度大约是正则表达式方法的25倍(使用计时器函数对每个代码进行了1000次迭代的计时)。
整理后的文章:
感谢您的答案。对我非常有帮助。然而,随着我的数据量增加,由于代码迭代次数的增加,我意识到这段代码正在减慢我的应用程序。例如,对于1万次迭代,这段代码需要大约20秒的时间。
我使用了以下基于您答案的代码:
Function CleanString(ByVal InputString As String, Optional SplWords = "USP|BP|EP|IP|JP", _ Optional Delim As String = "|") As String Dim i As Integer Dim ArrIsEmpty As Boolean Dim ArrSplWords() As String Dim Wrd As Variant Dim RE As Object CleanString = InputString ArrSplWords = Split(SplWords, Delim) Set RE = CreateObject("VBScript.RegExp") RE.Global = True RE.ignorecase = True For Each Wrd In ArrSplWords RE.Pattern = "\b" & Wrd & "\b" If RE.test(CleanString) Then CleanString = RE.Replace(CleanString, "") End If Next Wrd CleanString = Application.WorksheetFunction.Trim(CleanString) End Function
为了解决速度慢的问题,我决定放弃正则表达式的方法,并使用了下面的代码。经过评估,发现这个函数的速度大约是正则表达式方法的25倍(使用计时器函数对每个代码进行了1000次迭代的计时)。
Function CleanString(ByVal InputString As String, Optional SplWords As String = "USP|BP|EP|IP|JP", _ Optional Delim As String = "|", Optional WordSeparator As String = " ", _ Optional SplChar As String = "~|`|!|@|#|$|%|^|&|*|-|+|=|'|<|>|,|.|/|\|?|:|;") As String Dim TestStr As String Dim ArrSplChar() As String Dim Char As Variant Dim TestWords() As String Dim Wrd As Variant Dim Counter As Integer TestStr = InputString ArrSplChar = Split(SplChar, Delim, -1, vbTextCompare) For Each Char In ArrSplChar TestStr = Replace(TestStr, Char, WordSeparator & Char & WordSeparator, 1, -1, vbTextCompare) Next Char TestWords = Split(TestStr, WordSeparator, -1, vbTextCompare) For Each Wrd In TestWords Counter = IIf(Wrd = "", Counter + 1, Counter) If InStr(1, LCase(SplWords), LCase(Wrd), vbTextCompare) = 0 Then CleanString = CleanString & " " & Wrd Counter = Counter + 1 End If Next Wrd CleanString = IIf(Counter - 1 = UBound(TestWords) - LBound(TestWords), _ Application.WorksheetFunction.Trim(InputString), _ Application.WorksheetFunction.Trim(CleanString)) End Function
这个函数看起来比基于正则表达式的函数要乱一些,但是它的速度比正则表达式的函数要快。
以上两个函数可以生成相同的输出,并且可以按照以下方式调用:
Sub TestSub() Debug.Print CleanString("Paracetamol USP") End Sub
这将在立即窗口中打印出"Paracetamol"。