阿拉伯语单词搜索工具

时间:2014-04-14 12:30:58

标签: vb6

我想制作一个搜索工具,用阿拉伯语找到一个我能找到的单词,例如:

ذهبالولدإلىالمدرسةمنالبيتومنهمالىالبيت

如果我试图找到“من”这个词,代码不仅会找到“من”这个词,还会找到“منهم”这个词的一部分。我不希望程序这样做。我想找到“من”这个词以及每个喜欢它的词,并在整个单词中使用。

为了使事情更清楚(使用英语示例),如果我要在下面的句子中搜索“to”这个词,我只想找到整个单词,而不是包含单词'to'的单词'比如'朝向'成为结果的一部分。

句子:我想去公共汽车。

2 个答案:

答案 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运算符来隔离我感兴趣的值。