VBA (Excel) 正規表現検索中にテキストを除外する

VBA (Excel) 正規表現検索中にテキストを除外する

Excel 2016 (VBA) の正規表現を使用するマクロ内に、テキストからすべての数字を削除して、基本的にアルファベット文字のみにする関数があります。問題は、これらの数字が単なる数字ではなく、ローマ数字 (ローマ数字の 1 から 4、つまり I、II、III、IV のみを含む) である可能性があることです。例として、次の可能な項目のリストを見てみましょう。

Program Manager 3
Systems Engineer 3
Secretary III 12345
Consultant
IT Instructor 3
Computer Operations Manager 1
User Support Specialist 2
Engineering Tech II 12345
IT Instructor 2
Network Tech 3

私の関数は、次の VBA 正規表現コードを使用して数字とローマ数字を置き換えます (この時点ではトリミングなどについては心配していません)。

Public Function RemoveNumbers(Txt As String) As String
    With CreateObject("VBScript.RegExp")
        .Global = True
        .IgnoreCase = True
        .Pattern = "[0-9]|\s[i]+|\s[iv]$"
        RemoveNumbers = .Replace(Txt, "")
    End With
End Function

一般的には、これはうまく機能しますが、1つの問題に遭遇しました。私の正規表現は、フレーズを誤って変更しますITインストラクター2そしてそれをITインストラクター(スペースと単語のせいで講師、これはこれはローマ数字の1と同じです。私はオンラインで答えを見つけようとし、正規表現でこのフレーズを除外するために多くのバリエーションをテストしました。講師検索で使用してみましたが、うまくいきませんでした。私が試したパターンには次のようなものがあります:

        .Pattern = "\b(!Instructor)\b|[0-9]|\s[i]+|\s[iv]$"

        .Pattern = "\b(!Instructor)\b\w+|[0-9]|\s[i]+|\s[iv]$"

        .Pattern = "(!Instructor\b)|[0-9]|\s[i]+|\s[iv]$"
...etc

また、ローマ数字の 1 (I) を削除する必要があるため、回避策として以下を使用することはできません。

        .Pattern = "[0-9]|\s[i]{2,}|\s[iv]$"

Excel 2016 VBA 正規表現を使用して、文字列 (Instructor など) を検索から除外することは可能ですか? 可能であれば、VBA RegEx 中に項目を除外する正しい方法を教えていただけますか?

ありがとう

答え1

解決しました。次の構文が私には有効です (試行錯誤の末)。

    .Pattern = "\b(?!(?:Instructor)\b)(?:[0-9]+|\s[i]+|\s[iv]$)\b"

-- 以下に詳細を追加して編集しました --

私はさらに単語を追加しました(つまり、情報) を正規表現の除外に追加します:

"\b(?!(?:Info|Instructor)\b)(?:[0-9]+|\s[i]+|\s[iv]$)\b"

パターンの詳細:

  • \b - 単語境界を設定する
  • (?!(?:Info|Instructor)\b) - 後続の単語に対する 0 個または 1 個の (?) 除外 (!)。不要なため、非キャプチャ グループです。末尾の \b は単語の境界です。
  • (?:[0-9]+|\s[i]+|\s[iv]$) - 0~9の数字の1つ以上と一致します。スペース(\s)の後に1つ以上のi文字が続くものに一致します。スペースの後にivが続くものに一致します($は末尾に検索することを示します)
  • | = OR (全体を通して使用)
  • \b - 末尾の単語境界

-- 最終的にこれが私にとって最も効果的だったので編集しました --

        .Pattern = "\b(?:[0-9]+|\s[i]+|\s[iv]+$)\b"

関連情報