我正在尝试以正则表达式模式匹配希腊字符。似乎VBA在支持Unicode方面非常有限,但如果可能,我可以使用ASCII。以下是示例代码:
Sub TestGreekRegEx()
Dim str
str = "αυτό είναι ένα ελληνικό κείμενο"
Set regEx = CreateObject("vbscript.regexp")
regEx.Pattern = "\b[\xe1-\xfe]+\b"
Set Matches = regEx.Execute(str)
For Each Match In Matches
MsgBox Match
Next
End Sub
此返回根本没有匹配。另外,如果我在str的字符中循环,我得到的ASCII码在\ xE1到\ xFE的范围内。
谢谢
答案 0 :(得分:0)
试试这个
\b[\u00E1-\u03CE]+\b
顺便说一下,确保处理UNICODE字符的范围。
答案 1 :(得分:0)
撇开希腊char Unicode字符范围,您还有另一个问题:在ECMAScript 5标准中,\b
仅ASCII匹配边界。
因此,[\u00E1-\u03CE]+
或[\xE1-\xFE]+
的任何希腊语单词模式都对您有效,如果在两端添加\b
,您将不会获得匹配。
因此,您需要做的是使用一个组(在左侧)和一个前瞻(在右侧)建立自定义边界。要提取单词,您需要访问每个匹配项的.Submatches
属性。
我没有为非Unicode文件设置希腊语设置,所以让我想象一下您的单词模式是[\xE1-\xFE]+
。然后,您的提取正则表达式将如下所示:
(?:^|[^_0-9\xE1-\xFE])([\xE1-\xFE]+)(?![_0-9\xE1-\xFE])
使用[\u00E1-\u03CE]+
模式,它看起来像
(?:^|[^_0-9\u00E1-\u03CE])([\u00E1-\u03CE]+)(?![_0-9\u00E1-\u03CE])
请注意,我正在模仿\b
的单词边界,其左边为(?:^|[^_0-9\xE1-\xFE])
(它匹配字符串的开头或任何字符但_
,数字和您字符范围内的字母)和{右边的{1}}(无数字,(?![_0-9\xE1-\xFE])
,并且在单词匹配模式之后允许输入字符)。请注意,单词匹配模式会用括号括起来,以捕获为一组。 “问题”是非捕获组(_
)匹配也将落入结果中。这就是为什么我们需要访问(?:^|[^_0-9\xE1-\xFE])
:
.Submatches