将Unicode字符与正则表达式匹配

时间:2020-05-25 06:31:12

标签: regex vba ms-word

我可以在VBA for Word 2019中使用正则表达式:

Dim RegEx As New RegExp
Dim Matches As MatchCollection

RegEx.Pattern = "[\d\w]+"
Text = "HelloWorld"
Set Matches = RegEx.Execute(Text)

但是我怎么也可以匹配所有Unicode字符和所有数字?

\p{L}在PHP中对我来说很好用,但是在Word 2019的VBA中对我来说不起作用。

我想找到带有字符和数字的单词。因此,在PHP中,我使用了此[\p{L}\p{N}]+。我可以在VBA中使用哪种模式?

目前,我想将德语字符(例如äöüßÄÖÜ)与单词匹配。但是也许我也需要其他语言。

1 个答案:

答案 0 :(得分:3)

但是我怎么也可以匹配所有Unicode字符和所有数字?

“ VBScript正则表达式5.5”(我敢肯定您在这里使用)不是“ VBA正则表达式”,它们是一个COM库,您可以在VBA中使用它。它们不支持带有内置元字符(例如\w)的Unicode,并且不了解Unicode字符类(例如\p{L})。但是当然,您仍然可以将Unicode字符与之匹配。

直接匹配

最简单的方法当然是直接使用您在模式中搜索的Unicode字符。 VBA使用Unicode字符串,因此匹配Unicode本身就不是问题。在您的VBA源代码中表示Unicode本身是 not Unicode,这是另一回事。但是ChrW()可以帮上忙。

假设您要匹配某个字符,

RegEx.Pattern = ChrW(&h4E16) & ChrW(&h754C) 
Set Matches = RegEx.Execute(Text)

Msgbox Matches(0)

上面的代码在运行时使用十六进制数字(&h...ChrW()创建Unicode字符U + 4E16和U + 754C(世界)。当它们出现在您的文本中时,将找到它们。这很繁琐,但是如果您已经知道要查找的单词,它就可以很好地工作。

范围

如果要匹配字符范围,也可以这样做。使用范围的起点和终点。例如,“ CJK统一表意文字”范围的基本块从U + 4E00到U + 9FFF:

RegEx.Pattern = "[" + ChrW(&h4E00) & "-" & ChrW(&h9FFF) & "]+" 
Set Matches = RegEx.Execute(Text)

Msgbox Matches(0)

因此,这会创建自然范围,就像[a-z]+一样,以跨越所有CJK字符。您必须定义要匹配的范围,因此具有内置支持不那么方便,但是没有什么可以阻止您。

注意事项

以上内容与BMP(Basic Multilingual Plane)中的字符匹配有关。由于这些字符在Unicode中的工作方式,因此BMP之外的字符(例如Emoji表情)要困难得多。仍然可能,但是不会很漂亮。

有多种方式表示同一字符。例如,ä可以用其自己的单个代码点表示,也可以用a后跟点的第二个代码点表示(U + 0308“◌̈”)。由于无法确定输入字符串如何表示某些字符,因此在搜索字符串之前,应先查看 Unicode规范化使字符串统一。在VBA中,此can be done by using the Win32 API

助手

您可以手动研究Unicode范围,但是由于存在很多范围,因此很容易错过其中的一些范围。我记得一个手动选择Unicode范围的有用帮助者,该范围现在仍然存在于Internet存档中:http://web.archive.org/web/20191118224127/http://kourge.net/projects/regexp-unicode-block

它使您可以快速构建跨越多个范围的正则表达式。它针对JavaScript,但是很容易将输出适配VBA代码。

"Regular Expression: Match Unicode Block Range" Tool