0

C# で正規表現を使用して、次の文字列のすべての部分文字列を照合して抽出できるようにしたいと考えています。

"2012-05-15 00:49:02 192.168.100.10 POST /Microsoft-Server-ActiveSync/default.eas User=nikced&DeviceId=ApplDNWGRKZQDTC0&DeviceType=iPhone&Cmd=Ping&Log=V121_Sst8_LdapC0_LdapL0_RpcC31_RpcL50_Hb3540_Erq1_Pk1728465481_S2_ 443 redcloud\nikced 94.234.170.42 Apple-iPhone4C1/902.179 200 0 64 3140491"

これはログファイルであるため、正規表現は同様のタイプの行を処理できるはずです。

この場合、コレクションへの優先出力は次のようになります。

2012-05-15
00:49:02
192.168.100.10
/Microsoft-Server-ActiveSync/default.eas
User=nikced&DeviceId=ApplDNWGRKZQDTC0&DeviceType=iPhone&Cmd=Ping&Log=V121_Sst8_LdapC0_LdapL0_RpcC31_RpcL50_Hb3540_Erq1_Pk1728465481_S2_
443
redcloud\nikced
94.234.170.42
Apple-iPhone4C1/902.179
200
0
64
3140491

上記の部分文字列をコレクションに抽出するために、C#、.net、および Regex を使用して回答を評価してください (MatchCollection を推奨)。すべてのログ行は、同じ形式とパターンに従います。

4

5 に答える 5

3

信じられないほど複雑な正規表現の受信:

logFile.Split(' ');
于 2012-05-18T14:38:43.493 に答える
1

正規表現を使用する必要はありません。String.Split Methodを使用するだけで、セパレータとしてスペースを指定できます。

  string [] substrings = line.Split(new Char [] {' '});

各パーツの種類を特定する必要がある場合は、何を見つける必要があるかを指定する必要があり、そのための正規表現を作成できます。

とにかく、本当に正規表現を使用したい場合は、次のようにします。

  Regex re = new Regex (@"(?:(?<s>[^ ]+)(?: |$))*");

これにより、Match メソッドを呼び出すと、「s」グループのすべてのキャプチャが得られます。

OPがコメントで指摘したように、セパレーターは単一のスペース以外のものであれば何でもかまいません。可能なセパレーターは、式の(?: |$)と の[^ ]部分に含める必要があります。つまり、タブだけでなくスペースもセパレータとして使用できる場合は、その部分を(?: |\t|$)andに置き換え[^ \t]ます。これらの文字を区切り文字として複数受け入れる必要がある場合は、グループの+後にa を追加します。()

  (?:(?<s>[^ \t]+)(?: |\t|$)+)*
于 2012-05-18T14:45:37.497 に答える
1

これにより、スペースで区切られたすべての「行」を取得するために反復できる配列が得られます

string[] lines = log.Split(' ');
于 2012-05-18T14:40:35.520 に答える
0

本当に、あなたはこれを部分に分解する必要があります。

まず、日付。常にYYYY-MM-DD形式になりますか?地域/文化の設定によって異なる可能性はありますか?

(?<LogDate>dddd-dd-dd)

次に、時間があります。同じこと:

(?<LogTime>dd:dd:dd)

次に、これが実際に呼び出されたWebメソッドだと思いますか?データがどのように配置されているかを実際に説明していないため、完全にはわかりません。ただし、POSTまたはGETのいずれかになると想定しているので、次に行うのはそれです...

(?<LogMethod>POST|GET)

興味のあるログ行のすべての部分に対してこれを行うだけで、設定されます。IE:

(?<LogDate>dddd-dd-dd) (?<LogTime>dd:dd:dd) (?<LogMethod>POST|GET)...

行の開始/終了に固定する場合は、必ずそれぞれ^と$を使用してください。一致を取得するとき、名前付きグループ(などmatch.Groups["LogMethod"].Value)を使用してGroupsプロパティにインデックスを付けることにより、各グループから値を取得できます。幸運を!

于 2012-05-18T15:12:57.923 に答える
0

最速かつ最も明白な方法は、次を使用することString.Splitです。

string[] substrings = result = line->Split( nullptr, StringSplitOptions::RemoveEmptyEntries );

しかし、あなたが主張するならMatchCollection、これはあなたが望むことをします

MatchCollection ^ substrings = Regex.Matches(line, "\\S+")
于 2012-05-18T15:08:01.387 に答える