我们说我有"拉斯维加斯是伟大的"在单元格A1中。我想写一个寻找确切单词的公式," gas"在细胞中。 Vegas≠gas,但我发现的唯一搜索公式:
=ISNUMBER(SEARCH("gas",lower(A1))
返回true。无论如何要做精确匹配吗?理想情况下,我认为它是非区分大小写的,我相信通过将A1包装在lower()中来满足。
答案 0 :(得分:4)
我相信能够正确地覆盖你必须在术语之前和之后填充空格的情况" gas"和搜索词。这将确保在细胞的开始或结束处发现气体,并且还防止在任何单词的中间发现气体。你的帖子没有说明文件中是否存在标点符号,但是为了适应搜索周围的标点符号填充空间将无法正常工作,你必须包括"加油站。 " "加油站! "等,以允许任何标点符号。如果你担心像" gas.cost"或类似的,您可以在标点符号搜索周围使用相同的填充。
=Or(ISNUMBER(SEARCH(" gas ", " "&A1&" ")),ISNUMBER(SEARCH(" gas. ", " "&A1&" ")))
基本搜索应该单独返回单词gas,或者#gas;" gas。"在" gas之后填充空间。"在搜索中,它会将它作为句子中的最后一个词,或者在单元格的末尾。
编辑:删掉括号。
答案 1 :(得分:3)
Find function区分大小写。 SEARCH function不是。如果您使用SEARCH,则无需LOWER function。
搜寻( < find_text>,< within_text>,[可选]< start_num> 的)强>
在空格中包裹 find_text 和 within_text 并执行搜索。
B1中的公式是,
=ISNUMBER(SEARCH(" gas ", " "&A1&" "))
根据需要填写。
答案 2 :(得分:3)
也可以在VBA中使用正则表达式来完成此任务。在正则表达式中," \ b"代表一个单词边界。单词边界定义为单词和非单词字符之间的位置或行的开头或结尾。单词字符是[A-Za-z0-9_](字母,数字和下划线)。因此,可以使用此UDF。您需要注意,包含非单词字符(例如连字符)的单词可能会以不同于您预期的方式处理。如果您正在处理非英文字母,则需要修改模式。
但代码相当紧凑。
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
答案 3 :(得分:1)
我认为覆盖搜索词周围所有可能标点符号的唯一方法是创建自定义宏功能。使用增强的分割功能将句子标记为一个单词数组,然后搜索数组以进行匹配。
增强的分割功能 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表中调用。
=FindEngWord(A1,"gas")
答案 4 :(得分:0)
我认为这将处理您计划处理的所有案例:
=OR(ISNUMBER(SEARCH(" gas",LOWER(A1), 1 )), LEFT(A1,3)= "gas")
我在搜索中的“气体”之前添加了一个空格。如果气体是细胞中的唯一单词或单元格中的第一个单词,则此函数的右侧部分处理该情况。