2

次のようにスキャンするテキストがあります。

   -- FIRST BLOCK
   Begin PRJFW_EDITM.TXT_EDITM TXT_CLIFOR 
      Height          =   300
      Left            =   2685
      DBField         =   "CG44_CLIFOR"
      Caption         =   "Codice cliente fornitore"
      Object.Tag             =   "Codice cliente fornitore"
      MaxWidth        =   8
   End

   -- SECOND BLOCK
   Begin PRJFW_EDITM.TXT_EDITM TXT_CLIFOR 
      Height          =   300
      Left            =   2685
      DBField         =   "CG44_CLIFOR"
      Caption         =   "Codice cliente fornitore"
      Object.Tag             =   "Codice cliente fornitore"
      MaxWidth        =   6
   End

   -- THIRD BLOCK
   Begin PRJFW_EDITM.TXT_EDITM TXT_CLIFOR 
      Height          =   300
      Left            =   2685
      DBField         =   "CG16_ANAG"
      Caption         =   "Codice cliente fornitore"
      Object.Tag             =   "Codice cliente fornitore"
      MaxWidth        =   6
   End

( ) のブロックのみを一致させたいMaxWidth=6

私はいくつかのテストを行っていますが、何かが間違っています...たとえば、次の正規表現を使用しています:

(Begin[\s\S]+?(MaxWidth.*=)[\s\S]+?End)

上記のコードに表示されているツリー ブロックを正しく一致させています。

次に、「MaxWidth」プロパティの値が「6」のブロックのみに一致するように regEx を変更しようとすると、次のようになります。

(Begin[\s\S]+?(MaxWidth.*=   6)[\s\S]+?End)

私は 2 つのブロックだけを正しく一致させましたが、最初のブロックは間違っています。最初の試合:

Begin PRJFW_EDITM.TXT_EDITM TXT_CLIFOR 
      Height          =   300
      Left            =   2685
      DBField         =   "CG44_CLIFOR"
      Caption         =   "Codice cliente fornitore"
      Object.Tag             =   "Codice cliente fornitore"
      MaxWidth        =   8
   End

   -- SECOND BLOCK
   Begin PRJFW_EDITM.TXT_EDITM TXT_CLIFOR 
      Height          =   300
      Left            =   2685
      DBField         =   "CG44_CLIFOR"
      Caption         =   "Codice cliente fornitore"
      Object.Tag             =   "Codice cliente fornitore"
      MaxWidth        =   6
   End

最初の 'Begin' で始まり、2 番目のブロックの正しいプロパティ値で終了します。それは間違っている。

( MaxWidth=6) が各 Begin...End ブロック内で一致するようにします。このようなもの(上記の私のコードを参照):

最初の試合:

   Begin PRJFW_EDITM.TXT_EDITM TXT_CLIFOR 
      Height          =   300
      Left            =   2685
      DBField         =   "CG44_CLIFOR"
      Caption         =   "Codice cliente fornitore"
      Object.Tag             =   "Codice cliente fornitore"
      MaxWidth        =   6
   End

2 番目の一致:

   Begin PRJFW_EDITM.TXT_EDITM TXT_CLIFOR 
      Height          =   300
      Left            =   2685
      DBField         =   "CG16_ANAG"
      Caption         =   "Codice cliente fornitore"
      Object.Tag             =   "Codice cliente fornitore"
      MaxWidth        =   6
   End

どうやってやるの?私の正規表現で何が問題になっていますか?

ありがとうございました。

4

2 に答える 2

3

それが可能だ。入力ファイルがで利用可能であると仮定しますc:\test.txt。入力テキストを含みます。

The module

Option Explicit
'requires Microsoft Scripting Runtime
Public Sub test()
    Dim fields(5) As String
    fields(0) = vbNullChar
    fields(1) = vbNullChar
    fields(2) = """CG44_CLIFOR"""
    fields(3) = vbNullChar
    fields(4) = vbNullChar
    fields(5) = "6"


    Dim fpath$, x
    fpath = "c:\test.txt"
    x = Join(GetBlock(fpath, fields), vbCrLf & vbCrLf & vbCrLf)
    MsgBox x

End Sub

Public Function GetBlock(fpath$, textArr As Variant) As Variant
    Dim results As Variant
    Dim fso As New Scripting.FileSystemObject
    Dim re As New VBScript_RegExp_55.RegExp

    If UBound(textArr) <> 5 Then
        MsgBox "Invalid data provided!"
        Exit Function
    End If

    Dim fields(5) As String
    fields(0) = "Height += +"
    fields(1) = "Left += +"
    fields(2) = "DBField += +"
    fields(3) = "Caption += +"
    fields(4) = "Object\.Tag += +"
    fields(5) = "MaxWidth += +"

    Dim p&, validPos$

    p = 0
    For p = LBound(fields) To UBound(fields)
        If textArr(p) <> vbNullChar Then
            fields(p) = fields(p) & EscapeString(CStr(textArr(p)))
            validPos = validPos & CStr(p) & "|"
        End If
    Next p


    Dim content$, result As Boolean, outText$
    content = fso.OpenTextFile(fpath).ReadAll()
    outText = vbNullChar
    With re
        .Global = True
        .IgnoreCase = True
        .MultiLine = False
        .Pattern = "--[\s\S]+?(?=--)"
        If .test(content) = True Then
            Dim m, posz
            posz = Split(validPos, "|")
            result = True
            Dim mt As Match, mts As MatchCollection
            Set mts = .Execute(content)
            For Each mt In mts
                outText = mt.Value
                Dim po
                For Each po In posz
                    If po <> "" Then
                        m = fields(CStr(po))
                        .Pattern = m
                        result = .test(outText)
                    End If
                Next po
                For Each m In fields

                Next m
                If result = True Then
                    results = results & "<cylian/>" & outText
                End If
            Next mt
        Else
            result = False
        End If
    End With
    GetBlock = Split(results, "<cylian/>", -1, vbBinaryCompare)
End Function

Private Function EscapeString(str$) As String
    'some general replaces
    Dim a$
    a = str
    a = Replace(a, """", """""")
    a = Replace(a, ".", "\.")
    a = Replace(a, "}", "\}")
    a = Replace(a, "{", "\{")
    a = Replace(a, ")", "\)")
    a = Replace(a, "(", "\(")
    a = Replace(a, "+", "\+")
    a = Replace(a, "*", "\*")
    a = Replace(a, "-", "\-")
    a = Replace(a, "\", "\\")
    a = Replace(a, "^", "\^")
    a = Replace(a, "$", "\$")
    EscapeString = a
End Function

The calling (from immediate window)

test

The outcome

ここに画像の説明を入力してください

お役に立てれば。

于 2012-09-10T08:45:54.267 に答える
1

はい、可能です。正規表現に複数行オプションを使用する 複数行の使用方法の例については、この記事を参照してください。

VBscript は、キャリッジ リターンとライン フィードの制御文字を認識できません。ただし、行頭と行末を認識する必要があります。

于 2012-09-10T07:58:19.967 に答える