2文字の間にあるすべてのものを取り除くために、以前に設定したマッチングパターンを無効にする方法を探しています。RegExp - パターンにマッチしない文字列を何も置き換えません。
"/ * comment * /"形式のSQLコードでコメントに一致するコードがあります。これは、列Aの元のコードをピックアップして、コメントを削除、列Bにトリミングされた文字列を配置します:
Sub FindComments()
Dim xOutArr As Variant
Dim RegEx As Object
Dim xOutRg As Range
Dim SQLString As Variant
Dim i As Integer
Dim lr As Long
lr = Worksheets("Sheet1").Cells(Rows.count, "A").End(xlUp).Row
For i = 2 To lr
SQLString = Worksheets("Sheet1").Cells(i, "A").Value
Set RegEx = CreateObject("VBScript.RegExp")
With RegEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = "(/\*(.*?)\*/)"
End With
If RegEx.test(SQLString) Then
SQLString = RegEx.replace(SQLString, "")
End If
Set RegEx = Nothing
xOutArr = VBA.Split(SQLString, ";")
Set xOutRg = Worksheets("Sheet1").Range("B" & (Worksheets("Sheet1").Cells(Rows.count, "B").End(xlUp).Row + 1))
xOutRg.Range("A1").Resize(UBound(xOutArr) + 1, 1) = Application.WorksheetFunction.Transpose(xOutArr)
Next i
End Sub
上記のコードは、「/ *」の間に書かれたものと「* /」を見つけ、それを削除しますが、私は2つの文字の間にあるものを引き出すこともできるようにしたいと思います。私はそのパターン(または "<コメント"のような他のパターン)を満たさないすべてのものにマッチする必要があります。これには改行などが含まれます。これは特にVBAのためのものであり、文字列全体を検索してそのパターンが現れるすべてのインスタンスを検索できる必要があります。私の目標は、これらの文字の間に(パターン内の)内容をC列に入れることです。
このためのRegExpパターンは何ですか? SQLSTRINGの
例としては、次のようになります。デュアルから
1)/ *ステップ1 * /選択*;
2)/ *ステップ2 */select * from dual;/* Step 3 */Select * from Table
"/ * Step#* /"を削除してSQLコードをキャプチャしていますが、これらのコメントも(C列に)キャプチャしたいと思います。 1)と2)は1行です。 2)には複数のクエリがあります。各行は「;」で分割されています。クエリを1つずつ実行するために使用します。コルCにそれぞれ1を格納し、試合のコレクションをループし、元のSQLからそれを削除するReplace()
を使用します:代わりにあなたがSQLから一致するすべての文字列を取得するためにMatch
を使用することができますTest
を使用しての
VBA/VBScriptを使用してパターンを無効にすることはできませんか?私は(?!パターン)が必要なものだと言う投稿を見たことがありますが、SQLとコメントの両方で元のテキストと異なるものは返されません。あなたの答えは、それが立つように十分な回避策になるだろうが、私は本当に正規表現のパターンの逆マッチングを処理する唯一の方法であるかどうか疑問に思っています。 –
私はここで "逆マッチング"を構成するものが明確ではないと思う - 「コメントではない」よりもコメントを特定する方がはるかに簡単だ –
基本的に私が保持したいものはパターンで表示されるシンボル+ランダムストリング+シンボル)。私はRegExpを使って "このパターンを満足しないこの文字列にすべて一致する"と言う方法があるのだろうかと思っています。保管したくないものを選択すると、何も置き換えられません。 –