excel 拆分阿拉伯语名称字符并将结果存储在数组中

rm5edbpk  于 2023-02-05  发布在  其他
关注(0)|答案(1)|浏览(113)

我有一个阿拉伯名字,我正在尝试拆分阿拉伯字符,并在同一时间识别字符,如果第一,中间或最后这里是我的尝试,但我不能修复代码

Sub Split_Arabic_Name()
    Dim sName As String, i As Long
    sName = "حاتم علاء خميس سيد"
    Dim result() As String
    Dim index As Integer
    index = 0
    For i = 1 To Len(sName)
        If AscW(Mid(sName, i, 1)) >= &HD800 And AscW(Mid(sName, i, 1)) <= &HDBFF Then
            ReDim Preserve result(index)
            result(index) = Mid(sName, i, 2)
            index = index + 1
            i = i + 1
        Else
            If Mid(sName, i, 1) <> " " Then
                ReDim Preserve result(index)
                result(index) = Mid(sName, i, 1)
                index = index + 1
            End If
        End If
    Next i
    Dim arrName() As String
    ReDim arrName(0 To UBound(result), 0 To 1)
    Dim first As Integer, middle As Integer, last As Integer
    first = 0
    middle = 0
    last = 0
    For i = 0 To UBound(result)
        arrName(i, 0) = result(i)
        If (i = 0) Or (Mid(sName, i + 1, 1) = " ") Then
            arrName(i, 1) = "First"
        ElseIf Mid(sName, i + 1, 1) = " " Then
            arrName(i, 1) = "Last"
        Else
            arrName(i, 1) = "Middle"
        End If
    Next i
    Range("H1").Resize(UBound(arrName, 1) + 1, UBound(arrName, 2) + 1).Value = arrName
End Sub

空格被认为是记号。名字以"⁄“开头,所以这是[第一个] --然后是”⁄“,然后是”⁄“,接着是空格,所以这是[最后一个]。
空格后的第二个名字是“”,应该是[First] --然后是字符“”,然后是字符“”,然后是字符“”,最后是字符“”,就像它在空格前一样。
至于姓氏“anium”“lic”,[First]是“anium”,但“lic”[Middle] --整个名称的最后一个字符不是空格,但它是最后一个字符,因此是[Last]
这是我得到的结果的快照,我键入了注解x1c 0d1x

eqqqjvef

eqqqjvef1#

根据我的评论,正则表达式可能不是一个坏主意:

Sub Test()

Dim s As String: s = [A1]
Dim x As Long: x = 1
Dim tst As String

With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = "(?:^|\s)(\S)|(\S)(?!\s|$)|(\S)(?=\s|$)"
    Set matches = .Execute(s)
    If Not matches Is Nothing Then
        For Each Match In matches
            x = x + 1
            tst = Match.Submatches(0) & Match.Submatches(1) & Match.Submatches(2)
            Select Case tst
                Case Match.Submatches(0)
                    Cells(x, 2).Value = "First"
                Case Match.Submatches(1)
                    Cells(x, 2).Value = "Middle"
                Case Match.Submatches(2)
                    Cells(x, 2).Value = "Last"
            End Select
            Cells(x, 1).Value = tst
        Next
    End If
End With

End Sub

模式(?:^|\s)(\S)|(\S)(?!\s|$)|(\S)(?=\s|$)背后的想法是捕获除空格之外的每个字符,作为它们各自组中的单独匹配。regex引擎确实认识到它需要从右到左读取输入。要分解此模式:

  • (?:^|\s)(\S)-单个非空白字符,前面是输入的开头空白字符;
  • (\S)(?!\s|$)-一个非空白字符**,而不是**后面跟一个空白字符或行尾。由于模式中的顺序或变化,这确实捕获了除第一个字符之外的正确字符;
  • (\S)(?=\s|$)-一个非空白字符,后跟空白字符,也不是行尾。由于模式中的顺序或变化,这确实捕获了除第一个字符之外的正确字符。

因此,组1中的每个匹配是“第一”,组2中的每个匹配是“中间”,组3中的每个匹配是“最后”。
查看在线demo

相关问题