正在搜索具有固定端

时间:2015-08-11 16:18:46

标签: string vba search text wildcard

我想搜索在其他字符串的集合(在Excel列中列出)中的某个短语之后结束的子字符串。

因此,假设我想在其他字符串中搜索字符串“BLUE MOON”,并且我想确定子字符串在“BLUE MOON”的“N”之后结束,以便在例如情况下避免结果为TRUE。 “蓝色月光”。换句话说,我需要的是搜索单词的任何部分,但只能是左手。右手应该有一个固定的边框,即零个额外的字符。 另一方面,如果开头不同,我需要积极的结果,例如“DARK BLUE MOON”应该为TRUE。因此,完全平等不是一种选择。

我想使用Find,但我相信这是不可能的。除了Find之外,*似乎不接受任何通配符。

以下是您要测试的一些词语:

  1. 期待搜索的积极结果:

    BLUE MOON
    DARK BLUE MOON
    LIGHT BLUE MOON
    
  2. 预期搜索的否定结果::

    BLUE MOONLIGHT
    LAST BLUE MOONSHINE
    BLUE MOONDANCE
    
  3. 任何提示也值得赞赏。现在我使用以下函数删除单词(工作正常,除了它还删除前面提到的具有负预期搜索结果的案例):

    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
    

1 个答案:

答案 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$"