我想搜索在其他字符串的集合(在Excel列中列出)中的某个短语之后结束的子字符串。
因此,假设我想在其他字符串中搜索字符串“BLUE MOON”,并且我想确定子字符串在“BLUE MOON”的“N”之后结束,以便在例如情况下避免结果为TRUE。 “蓝色月光”。换句话说,我需要的是搜索单词的任何部分,但只能是左手。右手应该有一个固定的边框,即零个额外的字符。 另一方面,如果开头不同,我需要积极的结果,例如“DARK BLUE MOON”应该为TRUE。因此,完全平等不是一种选择。
我想使用Find
,但我相信这是不可能的。除了Find
之外,*
似乎不接受任何通配符。
以下是您要测试的一些词语:
期待搜索的积极结果:
BLUE MOON
DARK BLUE MOON
LIGHT BLUE MOON
预期搜索的否定结果::
BLUE MOONLIGHT
LAST BLUE MOONSHINE
BLUE MOONDANCE
任何提示也值得赞赏。现在我使用以下函数删除单词(工作正常,除了它还删除前面提到的具有负预期搜索结果的案例):
Sub testingXXX()
Dim ws As Worksheet
Set ws = ActiveWorkbook.ActiveSheet
Dim aCell As Range, bCell As Range, aSave As String, y As Long
MyAr = Split("*BLUE MOON", ",")
For y = LBound(MyAr) To UBound(MyAr)
With ws
Set aCell = .Columns(1).Find(what:=MyAr(y), LookIn:=xlValues, _
lookat:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
If Not aCell Is Nothing Then
aSave = aCell.Address
Do
If bCell Is Nothing Then
Set bCell = .Range("A" & aCell.row)
Else
Set bCell = Union(bCell, .Range("A" & aCell.row))
End If
Set aCell = .Columns(1).FindNext(after:=aCell)
Loop Until aCell.Address = aSave
End If
Set aCell = Nothing
End With
Next y
If Not bCell Is Nothing Then bCell.EntireRow.Delete
End Sub
答案 0 :(得分:1)
这就是发明正则表达式的原因。如果您使用\b
指定字边框,则只会匹配完整的短语"BLUE MOON"
而不允许使用其他字符。以下内容将匹配包含"BLUE MOON"
的字符串:
Const PHRASES As String = "BLUE MOON,DARK BLUE MOON,LIGHT BLUE MOON,BLUE MOONLIGHT,LAST BLUE MOONSHINE,BLUE MOONDANCE"
Dim re
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "\bBLUE MOON\b"
Dim w
For Each w In Split(PHRASES, ",")
If re.Test(w) Then
Debug.Print w & " = Match"
Else
Debug.Print w & " = No match"
End If
Next
输出(为便于阅读而对齐):
BLUE MOON = Match
DARK BLUE MOON = Match
LIGHT BLUE MOON = Match
BLUE MOONLIGHT = No match
LAST BLUE MOONSHINE = No match
BLUE MOONDANCE = No match
如果你想确保字符串在"MOON"
之后完成而没有任何其他内容,请在你的模式中包含字符串结尾锚($
):
re.Pattern = "\bBLUE MOON$"