搜索和替换整个单词,这些单词不仅可以被空格分隔

18 浏览
0 Comments

搜索和替换整个单词,这些单词不仅可以被空格分隔

我正在寻找一种搜索和替换整个单词的方法。这些整个单词可以不仅通过空格分隔,还可以通过.,;:/?等进行分隔。

我想要做的是像这样的操作:

replace([address], ***--分隔符列表,如.,;:/?--*** & [replacewhat] & ***--分隔符列表,如.,;:/?--*** ," " & [replacewith] & " ")

我不知道如何传递一个分隔符列表,而不是为每个分隔符组合运行一次替换函数(与我要替换的300个单词结合起来,将导致大量的查询)。

0
0 Comments

问题的出现原因:

在处理过程中,代码使用了正则表达式来搜索和替换整个单词。然而,随着数据量的增加,代码的迭代次数也增加,导致应用程序的速度变慢。例如,对于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"。

0
0 Comments

问题出现的原因是搜索和替换的时候是区分大小写的,但实际上有些情况下我们希望是不区分大小写的。解决方法是在代码中加入一行代码

re.IgnoreCase = True

,这样就可以实现不区分大小写的搜索和替换。另外,在代码中使用了正则表达式的\b标记来表示单词边界,这样可以确保只替换整个单词而不是单词的一部分。通过在Immediate窗口中进行测试,我们可以看到代码的正常运行。最后,对于不同的分隔符,代码也可以正常工作。

0