2

私はかなり複雑な領域に入ったようです(とにかく私にとって)。次の行があるとしましょう:

1:11:39 "LOGIN ATTEMPT: "47576966" Arlond"

私がやろうとしているのは、時間 (1:11:39) ID (47576966) と名前 (Arlond) を分離することです。以下の正規表現まで到達しましたが、次に何をする必要があるのか​​ 迷っています。必要なものをすべて取得するには正規表現が正しくないことを理解しています。これは、For ループを正しく機能させるためにも助けが必要な場所です。私は分割と置換を正規表現する方法を調べてきましたが、これまでのところ、何も機能させることができませんでした。

([""'])(?:(?=(\\?))\2.)*?\1


Using TestFile As New IO.StreamReader(My.Settings.cfgPath & "tempRPT.txt", System.Text.Encoding.Default, False, 4096)
        Do Until TestFile.EndOfStream
            ScriptLine = TestFile.ReadLine
            ScriptLine = LCase(ScriptLine)
            If InStr(ScriptLine, "login attempt:") Then
                Dim m As MatchCollection = Regex.Matches(ScriptLine, "([""'])(?:(?=(\\?))\2.)*?\1")
                For Each x As Match In m

                Next
                'builder.AppendLine(ScriptLine)
            End If

        Loop
    End Using
4

2 に答える 2

1

正規表現に関しては、可能な限り明示することが最善であることが常にわかっています (アンカーなど)。入力データが見た目と同じように適切に動作すると仮定すると、次のようにすることができます。

^(\d{1,2}:\d{2}:\d{2})\s""LOGIN\sATTEMPT:\s""(\d+)""\s([^""]+)""$

それをコンポーネントに分割します。

^                       // Anchor: Start of string (or line).
(\d{1,2}:\d{2}:\d{2})   // Capture one or two digits, colon, two digits, colon, two digits.
\s""LOGIN\sATTEMPT:\s"" // Anchor: match (but don't capture) literal text.
(\d+)                   // Match/capture one or more digits. (maybe you could use \d{8} instead).
""\s                    // Anchor: literal text.
([^""]+)                // Match and capture everything that is not a quote.
""                      // Anchor: Literal quote.
$                       // Anchor: End of string (or line).

フィールドに(二重引用符)文字nameを含めることが許可されている場合、これは失敗します。"その場合は、最後の部分式をより寛容になるように変更する必要があります。

于 2012-07-30T19:03:01.650 に答える
1

DavidO の受け入れられた質問に応えて、私はそれをよりよく理解するために分解したことを示したかっただけです。

If InStr(ScriptLine, "login attempt:") Then
                Dim m As Match = Regex.Match(ScriptLine, ("(\d{1,2}:\d{2}:\d{2})"))
                hurrburr = m.Value
                'Regex.Replace(ScriptLine, "(\d{1,2}:\d{2}:\d{2})", "")
                Dim mm As Match = Regex.Match(ScriptLine, "(\d{7,8})")
                'ScriptLine = ScriptLine & " " & mm.Value
                hurrburr = hurrburr & " " & mm.Value
                Dim mmm As Match = Regex.Match(ScriptLine, """\s([^""]+)")
                temp = mmm.Value.Replace("""", "")
                hurrburr = hurrburr & " " & temp
                builder.AppendLine(hurrburr)
 End If
于 2012-07-30T19:39:21.453 に答える