我有一个阿拉伯名字,我正在尝试拆分阿拉伯字符,并在同一时间识别字符,如果第一,中间或最后这里是我的尝试,但我不能修复代码
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
1条答案
按热度按时间eqqqjvef1#
根据我的评论,正则表达式可能不是一个坏主意:
模式
(?:^|\s)(\S)|(\S)(?!\s|$)|(\S)(?=\s|$)
背后的想法是捕获除空格之外的每个字符,作为它们各自组中的单独匹配。regex引擎确实认识到它需要从右到左读取输入。要分解此模式:(?:^|\s)(\S)
-单个非空白字符,前面是输入的开头或空白字符;(\S)(?!\s|$)
-一个非空白字符**,而不是**后面跟一个空白字符或行尾。由于模式中的顺序或变化,这确实捕获了除第一个字符之外的正确字符;(\S)(?=\s|$)
-一个非空白字符,是后跟空白字符,也不是行尾。由于模式中的顺序或变化,这确实捕获了除第一个字符之外的正确字符。因此,组1中的每个匹配是“第一”,组2中的每个匹配是“中间”,组3中的每个匹配是“最后”。
查看在线demo