0
Regex messageServerRegex = 
    new Regex(@"([0-9\-]{10})\ ([0-9:]{8})\ \[TEXT\]\ (\[Server\])\ ([^\[]*)");

if (messageServerRegex.IsMatch(rchConsoleText))
{
    var infoMatches = messageServerRegex.Split(rchConsoleText);
    Console.WriteLine("Date: {0}\nTime: {1}\nType: {2}\nMessage: {3}",
    infoMatches[1], infoMatches[2], infoMatches[3], infoMatches[4]);
}

サーバーでフィルタリングするテキストの2つの例を次に示します。

2012-12-2402:24:18[テキスト][サーバー]2012-12-2402:24:18[テキスト][サーバー]サンプルテキスト。

この行から戻したい結果は次のとおりです。

日付:2012-12-14  
時間:02:24:18  
タイプ:[テキスト][サーバー]  
メッセージ:2012-12-2402:24:18[テキスト][サーバー]サンプルテキスト。  

しかし、それは次のように応答します:

日付:2012-12-14  
時間:02:24:18  
タイプ:[テキスト][サーバー]  
メッセージ:2012-12-24 02:24:18  

ご覧のとおり、日付と時刻のみが表示されます。これは、正規表現がフィルターを適用しているためです。日付と時刻を1回だけカットするようにするにはどうすればよいですか。

2番目の例は正常に機能します。これは次のとおりです。

2012-12-24 02:24:18[TEXT][Server]サンプルテキストサンプルテキストサンプルテキスト。

この行から戻したい結果は次のとおりです。

日付:2012-12-14  
時間:02:24:18  
タイプ:[テキスト][サーバー]  
メッセージ:サンプルテキストサンプルテキストサンプルテキスト。  
4

3 に答える 3

2

入力が行に分割されているかどうかわかりません。もしそうなら、それはマッチを使用するのは簡単です。

     var inputs = new string[]{
        @"2012-12-24 02:24:18 [TEXT] [Server] 2012-12-24 02:24:18 [TEXT] [Server] Sample text.",
        @"2012-12-24 02:24:18 [TEXT] [Server] Sample text sample text sample text."};

     foreach(string input in inputs)
     {
        string pattern = @"([0-9\-]{10}) ([0-9:]{8}) \[TEXT\]\ (\[Server\]) (.*)";
        var match = Regex.Match(input, pattern);
        Console.WriteLine(
           "Date: {0}\nTime: {1}\nType: {2}\nMessage: {3}",
           match.Groups[1].Value, match.Groups[2].Value, match.Groups[3].Value, match.Groups[4].Value);
     }

そうでなければ、それは少し難しくなります-代わりに.*それは((?!something that indicates the next entry).)

于 2012-12-24T02:46:28.000 に答える
0

正規表現の最後のグループは'['文字を除外しているため、[文字が含まれている場合、行のテキスト部分が一致しません。入力が単一のログメッセージを表す場合、除外は不要のようです。除外せずに試してみてください。*そしてそれが機能するかどうかを確認してください

于 2012-12-24T02:32:59.560 に答える
0

どうですか:

^([0-9\-]{10})\ ([0-9:]{8})\s*\[TEXT\]\s*\[Server\]\s*(.*)
于 2012-12-24T02:47:40.743 に答える