Excel 精确单词匹配

Excel Exact Word Matching

假设我在单元格 A1 中有 "Vegas is great"。我想编写一个公式来查找单元格中的确切单词 "gas"。 Vegas ≠ gas,但我找到的唯一搜索公式:

 =ISNUMBER(SEARCH("gas",lower(A1))

returns 是的。反正有做精确匹配吗?理想情况下,我希望它不区分大小写,我相信通过将 A1 包装在 lower() 中可以满足这一点。

我认为这将处理您计划处理的所有情况:

=OR(ISNUMBER(SEARCH(" gas",LOWER(A1), 1 )), LEFT(A1,3)= "gas")

我在搜索的"gas"前加了一个space。如果气体是单元格中的唯一单词或单元格中的第一个单词,则此函数的右侧部分会处理这种情况。

Find function is case sensitive. The SEARCH function is not. There is no need for the LOWER function 如果您使用的是 SEARCH。

SEARCH(, , [可选])

find_textwithin_text 包裹在空格中并执行搜索。

B1中的公式为,

=ISNUMBER(SEARCH(" gas ", " "&A1&" "))

根据需要填写。

我认为要正确覆盖案例,您必须在术语 "gas" 和搜索术语前后填充 spaces。这将确保在单元格的开头或结尾找到气体,并防止在任何单词的中间找到气体。您的 post 不表示标点符号是否可以存在于文件中,但要在搜索周围容纳标点符号填充 spaces 将无法正常工作,您必须包括“gas”的大小写。“gas !" 等特别允许使用任何标点符号。如果您担心捕获 "gas.cost" 或类似值,您可以在标点符号搜索周围使用相同的填充。

=Or(ISNUMBER(SEARCH(" gas ", " "&A1&" ")),ISNUMBER(SEARCH(" gas. ", " "&A1&" ")))

是一个基本搜索,应该 return 单词 gas 本身,或者 "gas." 通过在搜索中 "gas." 之后填充 space 它将找到它作为句子中的最后一个词,或单元格的末尾。

编辑:删除了括号。

我认为覆盖搜索词周围所有可能标点符号的唯一方法是创建自定义宏函数。使用增强的拆分功能将句子标记为单词数组,然后在数组中搜索匹配项。

增强拆分功能 https://msdn.microsoft.com/en-us/library/aa155763

如何创建自定义宏 http://www.wikihow.com/Create-a-User-Defined-Function-in-Microsoft-Excel

创建 FindEngWord 函数的代码

Public Function FindEngWord(ByVal TextToSearch As String, ByVal WordToFind As String) As Boolean

Dim WrdArray() As String
Dim text_string As String
Dim isFound As Boolean

isFound = False

text_string = TextToSearch

WrdArray() = Split(text_string)

isFound = False
For i = 0 To UBound(WrdArray)
    If LCase(WrdArray(i)) = LCase(WordToFind) Then
        isFound = True
    End If
Next i

FindEngWord = isFound

End Function


Public Function Split(ByVal InputText As String, _
         Optional ByVal Delimiter As String) As Variant

' This function splits the sentence in InputText into
' words and returns a string array of the words. Each
' element of the array contains one word.

    ' This constant contains punctuation and characters
    ' that should be filtered from the input string.
    Const CHARS = ".!?,;:""'()[]{}"
    Dim strReplacedText As String
    Dim intIndex As Integer

    ' Replace tab characters with space characters.
    strReplacedText = Trim(Replace(InputText, _
         vbTab, " "))

    ' Filter all specified characters from the string.
    For intIndex = 1 To Len(CHARS)
        strReplacedText = Trim(Replace(strReplacedText, _
            Mid(CHARS, intIndex, 1), " "))
    Next intIndex

    ' Loop until all consecutive space characters are
    ' replaced by a single space character.
    Do While InStr(strReplacedText, "  ")
        strReplacedText = Replace(strReplacedText, _
            "  ", " ")
    Loop

    ' Split the sentence into an array of words and return
    ' the array. If a delimiter is specified, use it.
    'MsgBox "String:" & strReplacedText
    If Len(Delimiter) = 0 Then
        Split = VBA.Split(strReplacedText)
    Else
        Split = VBA.Split(strReplacedText, Delimiter)
    End If
End Function

可以从您的 excel sheet 中调用。

=FindEngWord(A1,"gas")

也可以在 VBA 中使用正则表达式来完成此操作。在正则表达式中,“\b”表示单词边界。单词边界定义为单词和非单词字符之间的位置或行的开头或结尾。单词字符是 [A-Za-z0-9_](字母、数字和下划线)。因此,可以使用此 UDF。您确实需要注意,包含非单词字符(例如连字符)的单词可能会受到与您预期不同的处理。如果您处理的是非英文字母,则需要修改 Pattern。

不过代码比较紧凑

Option Explicit
Function reFindWord(FindWord As String, SearchText As String, Optional MatchCase As Boolean = False) As Boolean
    Dim RE As Object
    Dim sPattern As String
Set RE = CreateObject("vbscript.regexp")
sPattern = "\b" & FindWord & "\b"
With RE
    .Pattern = sPattern
    .ignorecase = Not MatchCase
    reFindWord = .test(SearchText)
End With
End Function