VBA正则表达式Unicode字符组支持替代方案咨询
解决VBA正则处理Unicode非字母数字替换的问题
刚好碰到过类似的困扰,VBA自带的正则确实不支持Unicode字符属性(比如\p{L}),而且默认的\w/\W只认拉丁字母数字。给你两个不用手动罗列字符的快速方案:
方案一:遍历字符+内置函数判断(简单可靠)
这个方法不用正则,直接逐个字符判断是否是字母数字(支持所有Unicode语言),把非目标字符替换成下划线,逻辑清晰且对所有Unicode字符有效:
Function ReplaceNonAlnumWithUnderscore(ByVal inputStr As String) As String Dim resultStr As String Dim charPos As Integer Dim currentChar As String Dim charCode As Long resultStr = "" For charPos = 1 To Len(inputStr) currentChar = Mid(inputStr, charPos, 1) charCode = AscW(currentChar) ' 判断是否是拉丁数字、大小写字母,或是Unicode字母/数字 If (charCode >= 48 And charCode <= 57) _ Or (charCode >= 65 And charCode <= 90) _ Or (charCode >= 97 And charCode <= 122) _ Or (charCode >= 128 And Application.WorksheetFunction.IsText(currentChar)) Then resultStr = resultStr & currentChar Else resultStr = resultStr & "_" End If Next charPos ReplaceNonAlnumWithUnderscore = resultStr End Function
怎么用?
直接在你的代码里调用这个函数就行,比如:
Sub TestReplace() Dim originalStr As String originalStr = "abc (for αβψ̌) and de (for δε)" Debug.Print ReplaceNonAlnumWithUnderscore(originalStr) ' 输出结果:abc__for_αβψ___and_de__for_δε_ End Sub
方案二:改进正则表达式(适合习惯用正则的场景)
虽然VBA正则不支持Unicode属性,但我们可以通过排除法构建模式,不过这个方法需要覆盖大部分Unicode字母范围(不如方案一全面,适合已知目标字符范围的场景):
Function RegReplaceUnicodeNonAlnum(ByVal inputStr As String) As String Dim regExp As Object Set regExp = CreateObject("VBScript.RegExp") regExp.Global = True ' 匹配所有非字母数字的字符(包含Unicode字母数字的排除) regExp.Pattern = "[^a-zA-Z0-9\u00C0-\u02AF\u0370-\u03FF\u1EA0-\u1EFF\u4E00-\u9FFF]" ' 上面的范围覆盖了常见的欧洲字母、希腊字母、中文等,可根据需求补充 RegReplaceUnicodeNonAlnum = regExp.Replace(inputStr, "_") End Function
说明
这个方案的缺点是需要手动补充Unicode字符范围,没法覆盖所有语言的字母,但如果你的业务场景只涉及特定几种语言的字符,这个方法也能用。
内容的提问来源于stack exchange,提问作者anefeletos




