我正在尝试使用Excel VBA中的以下RegEx删除所有不可打印和非ASCII(扩展)字符:
[^\x09\0A\0D\x20-\xFF]
理论上,这应该匹配任何不是制表符,换行符,回车符或可打印ASCII字符(十六进制20和FF或十二进制和二十五分之间的字符代码)。我已经确认here Microsoft VBScript正则表达式支持\ xCC表示法,其中CC是十六进制的ASCII码。
问题是这个正则表达式匹配127以上的每个字符。当匹配字符的代码大于127时,它会在match.value上抛出“无效的过程调用”。是不是只有VBScript RegExes不支持字符代码127以上?我似乎无法在任何地方找到这些数据。这是完整的代码:
regEx.Pattern = "[^\x09\0A\0D\x20-\xFF]"
regEx.IgnoreCase = True 'True to ignore case
regEx.Global = True 'True matches all occurances, False matches the first occurance
regEx.MultiLine = True
If regEx.Test(Cells(curRow, curCol).Value) Then
Set matches = regEx.Execute(Cells(curRow, curCol).Value)
numReplacements = numReplacements + matches.Count
For matchNum = matches.Count To 1 Step -1
Cells(numReplacements - matchNum + 2, 16).Value = matches.Item(matchNum).Value
Cells(numReplacements - matchNum + 2, 17).Value = Asc(matches.Item(matchNum).Value)
Next matchNum
Cells(curRow, curCol).Value = regEx.Replace(Cells(curRow, curCol).Value, replacements(pattNo))
End If
它匹配的第一个字符是0x96(& ndash)。当我观看“匹配”并展开它时,我可以在“手表”窗口中看到它。但是,当我尝试观看matches.Item(matchNum).Value我得到(见截图)。有什么想法吗?
答案 0 :(得分:1)
Microsoft VBScript正则表达式支持\ xCC表示法 CC是十六进制的ASCII码
请注意,ASCII是从\ x00到\ x7F定义的,其中可打印的ASCII字符是从\ x20到\ x7E。
代码\ x80及以上是Ansi,而不是ASCII。
尝试下一步:
Dim ii, sExPatern: sExPatern = "[^\x09\x0A\x0D\x20-\x7E\"
For ii = 128 To 255
sExPatern = sExPatern & Chr( ii)
Next
sExPatern = sExPatern & "]"
'...
regEx.Pattern = sExPatern
老实说,我不确定某些代码的可保存性,例如:十进制129,131,136,144,152,160(我的Ansi代码页是" Windows Central Europe",所以你可以考虑更详细的检查)