我想制作一个搜索工具,用阿拉伯语找到一个我能找到的单词,例如:
ذهبالولدإلىالمدرسةمنالبيتومنهمالىالبيت
如果我试图找到“من”这个词,代码不仅会找到“من”这个词,还会找到“منهم”这个词的一部分。我不希望程序这样做。我想找到“من”这个词以及每个喜欢它的词,并在整个单词中使用。
为了使事情更清楚(使用英语示例),如果我要在下面的句子中搜索“to”这个词,我只想找到整个单词,而不是包含单词'to'的单词'比如'朝向'成为结果的一部分。
句子:我想去公共汽车。
答案 0 :(得分:0)
这样的搜索可能令人沮丧。我通常做的是在搜索字符串的前面和末尾添加一个空格,然后搜索SearchString。
所以..."我想去公共汽车。"成为"我想去公共汽车。 &#34 ;.然后我搜索"到"。这种方法的问题是标点符号会导致问题。例如,如果您想搜索" bus",您可以使用:
"我想去公共汽车。 "并搜索"公共汽车"。由于在总线之后存在标点符号,因此无法找到。
我建议您使用正则表达式来实现此功能。 VB6没有内置的正则表达式,但您可以使用Microsoft VBScript正则表达式功能来实现此目的。请查看此页面以帮助您入门:http://support.microsoft.com/kb/818802
根据您的评论进行修改
你有这行代码:
pos = InStr(start_at, txtBody.Text, target)
尝试将该行更改为:
pos = InStr(start_at, " " & txtBody.Text & " ", " " & target & " ", vbBinaryCompare)
通过在代码中添加空格,您实际上正在检查(空间)目标(空间)。因此,您不会错过txtBody.Text开头或结尾的潜在匹配项,在那里添加空格(仅用于比较目的)。通过添加vbBinaryCompare,InStr现在将执行区分大小写的搜索。
答案 1 :(得分:0)
唯一完全彻底的方法是使用Instr()函数,然后检查下一个字符是标点符号,换行符,还是单词位于字符串的末尾,例如
Option Explicit
Private Declare Function GetStringTypeW Lib "Kernel32.dll" ( _
ByVal dwInfoType As Long, _
ByVal lpSrcStr As Long, _
ByVal cchSrc As Long, _
ByRef lpCharType As Integer _
) As Long
Private Const CT_CTYPE1 As Long = &H1
Private Const C1_UPPER As Long = &H1 ' Uppercase
Private Const C1_LOWER As Long = &H2 ' Lowercase
Private Const C1_DIGIT As Long = &H4 ' Decimal digits
Private Const C1_SPACE As Long = &H8 ' Space characters
Private Const C1_PUNCT As Long = &H10 ' Punctuation
Private Const C1_CNTRL As Long = &H20 ' Control characters
Private Const C1_BLANK As Long = &H40 ' Blank characters
Private Const C1_XDIGIT As Long = &H80 ' Hexadecimal digits
Private Const C1_ALPHA As Long = &H100 ' Any linguistic character: alphabetical, syllabary, or ideographic
Private Const C1_DEFINED As Long = &H200 ' A defined character, but not one of the other C1_* types
Function FindFullWord(ByVal in_lStartPos As Long, ByRef in_sText As String, ByRef in_sSearch As String, Optional ByVal in_eCompareMethod As VbCompareMethod = vbBinaryCompare) As Long
Dim nLenText As Long
Dim nLenSearch As Long
Dim sNextChar As String
Dim iCharType As Integer
FindFullWord = InStr(in_lStartPos, in_sText, in_sSearch, in_eCompareMethod)
' Did we find the search string in the text?
If (FindFullWord > 0) Then
' Save the length of the text.
nLenText = Len(in_sText)
nLenSearch = Len(in_sSearch)
Do
' Does this position mean that the search is the end of the string?
If (FindFullWord + nLenSearch - 1) = nLenText Then
' If so, we can exit now - there are no following characters.
Exit Function
End If
' Look at the next character.
sNextChar = Mid$(in_sText, FindFullWord + nLenSearch, 1)
' Is this next char a space, punctuation character, or a blank?
If (GetStringTypeW(CT_CTYPE1, StrPtr(sNextChar), 1, iCharType)) Then
If (iCharType And C1_SPACE) = C1_SPACE Then
Exit Function
ElseIf (iCharType And C1_PUNCT) = C1_PUNCT Then
Exit Function
ElseIf (iCharType And C1_BLANK) = C1_BLANK Then
Exit Function
End If
End If
' Find the position of the search string in the text.
FindFullWord = InStr(FindFullWord + nLenSearch, in_sText, in_sSearch, in_eCompareMethod)
Loop Until FindFullWord = 0
End If
End Function
我最初开始测试每个字符,这个字符可以跟着一个单词并且不会成为该单词的一部分,但代码开始变得很长。当然,我对阿拉伯语一无所知。所以我想知道是否有一种标准的方法来找出一般的"类型"一个角色,不管语言。事情就这样发生了。
Win32文档中记录了GetStringTypeW()方法,基本上可以检索有关字符串中所有字符的信息。就我而言,我只是在一段文字中查看跟随搜索词的字符。从字符串返回值的变量iCharType
是一个位域,并包含多个值或一起编码。我正在使用AND运算符来隔离我感兴趣的值。