vba在正则表达式中匹配希腊语

时间:2013-01-30 11:25:40

标签: regex vba ms-word

我正在尝试以正则表达式模式匹配希腊字符。似乎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的范围内。

谢谢

2 个答案:

答案 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