我可以在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中使用哪种模式?
目前,我想将德语字符(例如äöüßÄÖÜ
)与单词匹配。但是也许我也需要其他语言。
答案 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代码。