1

まず第一に、正規表現を使用することがここでの最善の解決策であるかどうかについて意見を述べたいと思います。私はこの分野にかなり慣れていません。正規表現は私が最初に見つけたものであり、長い間つかむ必要があるまでは、いくらか使いやすいように見えました。行外のテキストのセクション笑。正規表現にvb.net環境を使用しています。

基本的に、私はここでこの行を取っています:

21:24:55 "READ/WRITE: ['PASS',false,'27880739',[40,[459.313,2434.11,0.00221252]],[["ItemFlashlight","ItemWatch","ItemMap","ItemKnife","ItemEtool","ItemGPS","ItemHatchet","ItemCompass","ItemMatchbox","M9SD","ItemFlashlightRed","NVGoggles","Binocular_Vector","ItemToolbox","M4A1_AIM_SD_camo"],["ItemPainkiller","ItemMorphine","ItemSodaPepsi","FoodSteakCooked",["30Rnd_556x45_StanagSD",29],"30Rnd_556x45_StanagSD","30Rnd_556x45_StanagSD","30Rnd_556x45_StanagSD","30Rnd_556x45_StanagSD","30Rnd_556x45_StanagSD",["15Rnd_9x19_M9SD",12],["15Rnd_9x19_M9SD",10],"15Rnd_9x19_M9SD","15Rnd_9x19_M9SD","ItemBandage"]],["DZ_Backpack_EP1",[["BAF_AS50_TWS"],[1]],[["FoodSteakCooked","ItemPainkiller","ItemMorphine","ItemSodaCoke","5Rnd_127x99_as50","ItemBloodbag"],[2,1,1,2,4,1]]],[316,517,517],Sniper1_DZ,0.94]"

次の正規表現を使用します。

\[\[([\w|_|\""|,]*)\],\[([\w|_|\""|,|\[|\]]*)\]\],

以下を試して取得するには:

[["ItemFlashlight","ItemWatch","ItemMap","ItemKnife","ItemEtool","ItemGPS","ItemHatchet","ItemCompass","ItemMatchbox","M9SD","ItemFlashlightRed","NVGoggles","Binocular_Vector","ItemToolbox","M4A1_AIM_SD_camo"],["ItemPainkiller","ItemMorphine","ItemSodaPepsi","FoodSteakCooked",["30Rnd_556x45_StanagSD",29],"30Rnd_556x45_StanagSD","30Rnd_556x45_StanagSD","30Rnd_556x45_StanagSD","30Rnd_556x45_StanagSD","30Rnd_556x45_StanagSD",["15Rnd_9x19_M9SD",12],["15Rnd_9x19_M9SD",10],"15Rnd_9x19_M9SD","15Rnd_9x19_M9SD","ItemBandage"]]

ただし、正規表現に欠陥があるか、vb.netコードに欠陥があります。次のデータのみが表示されます。

[["ItemFlashlight","ItemWatch","ItemMap","ItemKnife","ItemEtool","ItemGPS","ItemHatchet","ItemCompass","ItemMatchbox","M9SD","ItemFlashlightRed","NVGoggles","Binocular_Vector","ItemToolbox","M4A1_AIM_SD_camo"],["ItemPainkiller","ItemMorphine","ItemSodaPepsi",

あなたがそれを覗く必要がある場合の私のvb.netコードは次のとおりです:

ListView1.Clear()
    Call initList(Me.ListView1)
    My.Computer.FileSystem.CurrentDirectory = My.Settings.cfgPath
    My.Computer.FileSystem.CopyFile("arma2oaserver.RPT", "tempRPT.txt")
    Dim ScriptLine As String = ""
    Dim path As String = My.Computer.FileSystem.CurrentDirectory & "\tempRPT.txt"
    Dim lines As String() = IO.File.ReadAllLines(path, System.Text.Encoding.Default)
    Dim que = New Queue(Of String)(lines)
    ProgressBar1.Maximum = lines.Count + 1
    ProgressBar1.Value = 0
    Do While que.Count > 0
        ScriptLine = que.Dequeue()
        ScriptLine = LCase(ScriptLine)
        If InStr(ScriptLine, "login attempt:") Then
            Dim rtime As Match = Regex.Match(ScriptLine, ("(\d{1,2}:\d{2}:\d{2})"))
            Dim nam As Match = Regex.Match(ScriptLine, "\""([^)]*)\""")
            Dim name As String = nam.ToString.Replace("""", "")
            Dim next_line As String = que.Peek      'Read next line temporarily                'This is where it would move to next line temporarily to read from it
            next_line = LCase(next_line)
            If InStr(next_line, "read/write:") > 0 Then 'Or InStr(next_line, "update: [b") > 0 Then 'And InStr(next_line, "setmarkerposlocal.sqf") < 1 Then
                Dim coords As Match = Regex.Match(next_line, "\[(\d+)\,\[(-?\d+)\.\d+\,(-?\d+)\.\d+,([\d|.|-]+)\]\]")
                Dim inv As Match = Regex.Match(next_line, "\[\[([\w|_|\""|,]*)\],\[([\w|_|\""|,|\[|\]]*)\]\],") '\[\[([\w|_|\""|,]*)\],\[([\w|_|\""|,|\[|\]]*)\]\],
                '\[\[([\w|_|\""|,]*)\],\[([\w|_|\""|,|\[|\]]*)\]\]:\[([\w|_|\""|,|\[|\]]*)\]\:
                Dim back As Match = Regex.Match(next_line, "\""([\w|_]+)\"",\[\[([\w|_|\""|,]*)\],\[([\d|,]*)\]\],\[\[([\w|_|\""|,]*)\],\[([\d|,]*)\]\]")
                Dim held As Match = Regex.Match(next_line, "\[\""([\w|_|\""|,]+)\""\,\d+\]")
                With Me.ListView1
                    .Items.Add(name.ToString)
                    With .Items(.Items.Count - 1).SubItems
                        .Add(rtime.ToString)
                        .Add(coords.ToString)
                        .Add(inv.ToString)
                        .Add(back.ToString)
                        .Add(held.ToString)
                    End With
                End With
            End If
        End If
        ProgressBar1.Value += 1
    Loop
    My.Computer.FileSystem.DeleteFile("tempRPT.txt")
    ProgressBar1.Value = 0

奇妙なことに、Expressoで正規表現をテストすると、完全に正しい一致が得られます。だから私は自分が何を間違っているのか分かりません。

4

3 に答える 3

1

使用している正規表現の何が問題になっているのかわかりませんが、この正規表現の最初の一致は正常に機能しているようです。

\[\[.*?\]\]

お役に立てれば。

-編集-

問題は正規表現ではなく、ListViewが文字列の表示を切り捨てていることです。こちらをご覧ください

于 2012-08-20T20:09:35.993 に答える
0

代わりに、次の正規表現を試してください。\Q[[\E(?:(?!\Q[[\E).)+]]

http://regex101.com/r/zP1aC5

バックリファレンスが必要な場合は、\Q[[\E((?:(?!\Q[[\E).)+)]]

于 2012-08-20T20:23:48.347 に答える
0

おそらく、単一行または複数行の入力テキストのどちらで作業しているかを指定する必要があります。入力テキスト形式に応じて、次のコマンドを試してください。

Dim variableName as Match = Regex.Match("input", "pattern", RegexOptions.SingleLine);

また

Dim variableName as Match = Regex.Match("input", "pattern", RegexOptions.Multiline);
于 2012-08-20T20:27:57.450 に答える