撇开希腊 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