4

Excel VBA で次の RegEx を使用して、すべての印刷不可および非 ASCII (拡張) 文字を削除しようとしています。

[^\x09\0A\0D\x20-\xFF]

これは、理論的には、タブ、ラインフィード、キャリッジ リターン、または印刷可能な ASCII 文字 (16 進数の 20 から FF または 12 進数の 32 から 255 の間の文字コード) 以外のものと一致するはずです。ここで、Microsoft VBScript の正規表現が \xCC 表記をサポートしていることを確認しました。ここで、CC は 16 進数の ASCII コードです。

問題は、この正規表現が 127 を超えるすべての文字に一致することです。一致する文字のコードが 127 を超えると、match.value で「無効なプロシージャ コール」がスローされます。VBScript RegEx が 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 を見ようとすると取得します (スクリーンショットを参照)。何か案は?

4

1 に答える 1

1

Microsoft VBScript 正規表現は、CC が 16 進数の ASCII コードである \xCC 表記をサポートします。

ASCII は \x00 から \x7F までで定義され、印刷可能な ASCII 文字は \x20 から \x7E までであることに注意してください。

\x80 以上のコードは、ASCII ではなく Ansi です。

次を試してください:

Dim ii, sExPatern: sExPatern = "[^\x09\x0A\x0D\x20-\x7E\"
For ii = 128 To 255
  sExPatern = sExPatern & Chr( ii)
Next
sExPatern = sExPatern & "]"
'...
regEx.Pattern = sExPatern

正直なところ、10 進法で 129、131、136、144、152、160 など、一部のコードの優先度についてはよくわかりません (私の Ansi コード ページは「Windows Central Europe」なので、詳細な調査を検討してください)。

于 2014-06-25T14:19:38.797 に答える