2017-08-24 9 views
0

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を使用しての

答えて

1

Sub Tester() 
    ExtractComments Range("A1") 
End Sub 



Sub ExtractComments(c As Range) 
    Dim re As Object 
    Dim allMatches, m, txt, comm 

    Set re = CreateObject("VBScript.RegExp") 
    re.Pattern = "(/\*(.*?)\*/)" 
    re.ignorecase = True 
    re.MultiLine = True 
    re.Global = True 

    txt = c.Value 

    Set allMatches = re.Execute(txt) 
    For Each m In allMatches 
     comm = comm & IIf(Len(comm) > 0, vbLf, "") & m 
     txt = Replace(txt, m, "") 
     Debug.Print Trim(m) 
    Next m 
    c.Offset(0, 1).Value = txt 
    c.Offset(0, 2).Value = comm 
End Sub 
+0

VBA/VBScriptを使用してパターンを無効にすることはできませんか?私は(?!パターン)が必要なものだと言う投稿を見たことがありますが、SQLとコメントの両方で元のテキストと異なるものは返されません。あなたの答えは、それが立つように十分な回避策になるだろうが、私は本当に正規表現のパターンの逆マッチングを処理する唯一の方法であるかどうか疑問に思っています。 –

+0

私はここで "逆マッチング"を構成するものが明確ではないと思う - 「コメントではない」よりもコメントを特定する方がはるかに簡単だ –

+0

基本的に私が保持したいものはパターンで表示されるシンボル+ランダムストリング+シンボル)。私はRegExpを使って "このパターンを満足しないこの文字列にすべて一致する"と言う方法があるのだろうかと思っています。保管したくないものを選択すると、何も置き換えられません。 –

関連する問題