Excel VBA中的RegEx不正确匹配扩展ASCII字符
我正试图使用Excel VBA中的以下RegEx删除所有不可打印和非ASCII(扩展)字符:
[^\x09\0A\0D\x20-\xFF]
这在理论上应该与任何不是制表符,换行符,回车符或可打印的ASCII字符(hex和hex之间的字符代码或十二进制和二十五和二十五进制)之间匹配。 我已经在这里证实,Microsoft VBScript正则expression式支持\ xcc表示法,其中CC是hex的ASCII码。
问题是,这个正则expression式匹配127以上的每个字符。然后,当匹配字符的代码高于127时,在match.value上抛出一个“无效的过程调用”。是不是VBScript RegExes不支持127以上的字符代码? 我似乎无法在任何地方find这个数据。 以下是完整的代码:
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我得到(见截图)。 有任何想法吗?
Microsoft VBScript正则expression式支持\ xcc表示法,其中CC是hex的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中欧”,所以你可以考虑更详细的检查)