匹配字符串中的完整单词

Posted

技术标签:

【中文标题】匹配字符串中的完整单词【英文标题】:Match Complete word in string 【发布时间】:2015-09-28 09:50:06 【问题描述】:

我有下面的代码,如果条件匹配,它会用服务填充偏移单元格。然而在这个阶段,它的操作基础是如果字符串出现在单元格中,它将应用值而不是单词是一个完整的单词。例如,我的标准中有“访问”,而“访问者”(在单元格内)将在我的代码中不应该遵守时。请问有人可以帮忙吗?

Option Compare Text
Sub CHECK_CELL_VALUES()
    Dim LASTROW As Long
    Application.ScreenUpdating = False
        With Sheet1
        LASTROW = .Range("A1048576").End(xlUp).Row


            For i = 2 To LASTROW
                If Cells(i, 7).Value Like "*Service*" _
                Or Cells(i, 7).Value Like "*Servicing*" _
                Or Cells(i, 7).Value Like "* Labour*" _
                Or Cells(i, 7).Value Like "* Job*" _
                Or Cells(i, 7).Value Like "* Hire*" _
                Or Cells(i, 7).Value Like "* Visit*" _
                Or Cells(i, 7).Value Like "* Scaffold*" _
                Or Cells(i, 7).Value Like "* Contract*" _
                Or Cells(i, 7).Value Like "* Hour*" _
                Or Cells(i, 7).Value Like "* Month*" _
                Or Cells(i, 7).Value Like "* Quarter*" _
                Or Cells(i, 7).Value Like "* Day*" _
                Or Cells(i, 7).Value Like "* Maintenance*" _
                Or Cells(i, 7).Value Like "* Repair*" _
                Or Cells(i, 7).Value Like "* Survey*" _
                Or Cells(i, 7).Value Like "* Training*" _
                Or Cells(i, 7).Value Like "* Calibration*" _
                Then Cells(i, 7).Offset(0, 46).Value = "Service"
                Debug.Print Cells(i, 7).Address
            Next i

        End With
    Application.ScreenUpdating = True
End Sub

【问题讨论】:

访问后为什么不加空格?所以“*访问*” 我也赞同@Trum 的建议,如果你想匹配这种情况,请将你的条件词用“访问”之类的空格包围 嗨,谢谢你的愚蠢 @Trum 如果单词位于行首或行尾,单独使用空格来定义单词会导致问题;或者如果单词以撇号或引号“结尾”。对于原始海报来说,这可能不是问题。但是,一般来说,为了定义一个单词,可以测试任何非单词字符,或者字符串的开头或结尾。这可以使用“直接 VBA”来完成,也可以使用具有单词边界标记的正则表达式轻松完成。 【参考方案1】:

我这样做的方法是: a) 在要搜索的字符串前后添加一个空格 b) 搜索前后添加空格的字符串。 这是一个搜索单词 VISIT 的示例 它会匹配 “访问” “一次访问” “访问某事” 但会排除 “访客”

InStr(1, " " & UCase(Sheets("Sheet1").Cells(i, 1)) & " ", " VISIT ")

【讨论】:

【参考方案2】:

尝试改变这个:

If Cells(i, 7).Value Like "*Service*"

到这里:

If InStr(Cells(i,7).Value,"Service") > 0

依此类推 - 这将匹配整个字符串 "Service" 更多关于 InStr 的信息可以找到 here

【讨论】:

您的代码仍会在更大的单词中找到片段。例如Instr("Visitor","Visit") 将返回一个 > 0 的值。

以上是关于匹配字符串中的完整单词的主要内容,如果未能解决你的问题,请参考以下文章

如何匹配字母和数字组合的单词,但避免只有数字的单词

正则表达式

PHP字符串替换匹配整个单词

php正则表达式

.NET:返回给定要匹配的整个单词列表的字符串列表

将表中字符串列的单词与另一列oracle中的字符串单词匹配