4

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

谢谢

4

2 回答 2

0

尝试这个

\b[\u00E1-\u03CE]+\b

顺便说一句,确保处理 UNICODE 字符范围。

于 2013-01-30T13:29:24.460 回答
0

撇开希腊 char Unicode 字符范围不谈,您还有另一个问题:\b在 ECMAScript 5 标准中,只有 ASCII 匹配边界。

因此,无论希腊词模式对你有用,[\u00E1-\u03CE]+或者[\xE1-\xFE]+,如果你\b在两端添加 s,你将不会得到匹配。

因此,您需要做的是使用组(左侧)和前瞻(右侧)构建自定义边界。要提取单词,您需要访问.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单词边界(它匹配字符串的开头或任何 char BUT 、数字和字符范围内的字母)和右侧(没有数字,并且在单词匹配模式之后允许您的字符)。请注意,单词匹配模式用括号括起来以将其捕获到一个组中。“问题”是非捕获组()匹配也落在结果中。这就是为什么我们需要访问:(?:^|[^_0-9\xE1-\xFE])_(?![_0-9\xE1-\xFE])_(?:^|[^_0-9\xE1-\xFE]).Submatches

Sub TestGreekRegEx()
Dim str 
str = "YOUR_NON_ASCII_STRING_HERE"
Set regEx = CreateObject("vbscript.regexp")
regEx.Pattern = "(?:^|[^_0-9\xE1-\xFE])([\xE1-\xFE]+)(?![_0-9\xE1-\xFE])"
Set Matches = regEx.Execute(str)
For Each Match In Matches
    MsgBox Match.Submatches(0)  ' <--- See here
Next
End Sub
于 2020-03-26T11:03:17.040 回答