1

私が何を求めているのかをサンプルコードで説明します。私の関数GetDoxは近くに見えますが、まだ不完全です。これがテストコードです。

'test begin...
'<dox>
'  <member type="Public Sub" name="Increment" return="void">
'    <param type="Integer" name="nBase" out="true" />
'    <param type="Integer" name="nStep" out="false" />
'    <purpose>
'      purpose here...
'    </purpose>
'  </member>
'  <member ... />
'</dox>
'other comments here...
Public Sub Increment(nBase, nStep) 'some example content
    nBase = nBase + nStep
End Sub
'<Unwonted_Item />

Dim source  'reading the same file just for simplification
With CreateObject("Scripting.FileSystemObject")
    With .OpenTextFile(WScript.ScriptFullName, 1, False)
        source = .ReadAll
    End With
End With
result = GetDox(source)
WScript.Echo result  'display our result

Function GetDox(sCode)  'unfinished function
    Dim regEx, Match, Matches, mVal, sEnd
    sEnd = "</dox>" & vbNewLine
    Set regEx = New RegExp
    regEx.Pattern = "('<dox>\n|'\s*<.*)" 'my ugly pattern
    regEx.IgnoreCase = True
    regEx.Global = True
    Set Matches = regEx.Execute(sCode)
    For Each Match In Matches
        mVal = Match.Value
        mVal = Replace(mVal, vbCr, vbNewLine)
        mVal = Right(mVal, Len(mVal) - 1)
        GetDox = GetDox & mVal
        If mVal = sEnd Then Exit For
    Next
End Function

これは私が得るものです:

<dox>
  <member type="Public Sub" name="Increment" return="void">
    <param type="Integer" name="nBase" out="true" />
    <param type="Integer" name="nStep" out="false" />
    <purpose>
    </purpose>
  </member>
  <member ... />
</dox>

そして、これは私が必要なものです:

<dox>
  <member type="Public Sub" name="Increment" return="void">
    <param type="Integer" name="nBase" out="true" />
    <param type="Integer" name="nStep" out="false" />
    <purpose>
      purpose here...
    </purpose>
  </member>
  <member ... />
</dox>

「ここでの目的...」の行が欠落していて、RegExp.Pattern構文全体が弱いことを私は知っています。すべてを含めることで始まり、すべてを含むことで<dox>終わるコンテンツ全体を選択したいのですが、パターン構文に固執しています。</dox>

PS 非常に優れた助けを借りて(すべての人に感謝します)、これが私の作業機能です:

Function GetDox(sCode)
    GetDox = vbNullString
    With New RegExp
        .Pattern    = "<dox>[\s\S]*?</dox>"
        .IgnoreCase = True
        .Global     = False
        With .Execute(sCode)
            If .Count = 0 Then Exit Function
            GetDox  = .Item(0).Value
        End With
        .Pattern    = "^'"
        .Global     = True
        .Multiline  = True
        GetDox = .Replace(GetDox, "")
    End With
End Function
4

2 に答える 2

2

最初に先頭の一重引用符を削除します。

regEx.Pattern = "^'"
regEx.Global  = True
sCode = regEx.Replace(sCode, "")

次に、XML テキストを抽出します。

regEx.Pattern = "<dox>[\s\S]*?</dox>"
regEx.Global  = False
regEx.IgnoreCase = True
Set m = regEx.Execute(sCode)
If m.Count > 0 Then GetDox = m(0).Value

その後、さらに処理するために XML をDOM ツリーに読み込む必要があります。

Set xml = CreateObject("Msxml2.DOMDocument.6.0")
xml.async = False
xml.loadXML result

XML が別のファイルにある場合は、@FrankSchmitt がコメントで提案したように、XML をファイルから直接ロードし、 XPath式でノードを抽出する必要があります。

Set xml = CreateObject("Msxml2.DOMDocument.6.0")
xml.async = False
xml.load "C:\path\to\your.xml"

Set nodes = xml.selectNodes("//dox")

XML は行指向ではないため、そうであるかのように解析するべきではありません。適切に処理しないと、物事は興味深い方法で壊れる可能性があります。

于 2013-03-17T10:53:52.633 に答える
1

コードを修復するには、次の正規表現を使用できます: ('<dox>\n|'\s*[\S \t]*) demo

それを行う別の方法は、最初に必要なものをすべて取得してから、その上に置換 <dox>[\s\S]+?<\/dox>を適用することです
^'

または、先頭の空白をクリアするには:
Search: ^'\s*and replace with nothing demo

于 2013-03-17T04:31:37.337 に答える