0

プログラムで、 の値がまたはのappGUIDいずれかであるすべての行を破棄したいと考えています。正規表現を使用してこれを達成するにはどうすればよいですか?wxnull

それが正規表現パターンであることを理解できません。助けてください。

私のログファイルの形式は次のとおりです。

INFO  [com.adobe.watson.vo.BugServices] WX Edit Bug: 3494430 Server: yukon.corp.adobe.com User:xinche appGUID: null
INFO  [com.adobe.watson.vo.BugServices] WX Edit Bug: 3494430 Server: yukon.corp.adobe.com User:xinche appGUID: null
INFO  [com.adobe.watson.vo.BugServices] WX Edit Bug: 3494430 Server: yukon.corp.adobe.com User:xinche appGUID: null
INFO  [com.adobe.watson.vo.BugServices] WX Edit Bug: 3419432 Server: yukon.corp.adobe.com User:prerelease appGUID: fcdd2153-bbdf
INFO  [com.adobe.watson.vo.BugServices] WX Edit Bug: 3419432 Server: yukon.corp.adobe.com User:prerelease appGUID: fcdd2153-bbdf
INFO  [com.adobe.watson.vo.BugServices] WX Edit Bug: 3419422 Server: yukon.corp.adobe.com User:prerelease appGUID: fcdd2153-bbdf
INFO  [com.adobe.watson.vo.BugServices] WX Edit Bug: 3419442 Server: yukon.corp.adobe.com User:prerelease appGUID: fcdd2153-bbdf
INFO  [com.adobe.watson.vo.BugServices] WX New Bug: 3494441 Server: yukon.corp.adobe.com User:bey81694 appGUID: wx
INFO  [com.adobe.watson.vo.BugServices] WX New Bug: 3494441 Server: yukon.corp.adobe.com User:bey81694 appGUID: wx
INFO  [com.adobe.watson.vo.BugServices] WX New Bug: 3494441 Server: yukon.corp.adobe.com User:bey81694 appGUID: wx

私のコードはここにあります:

StreamReader reader = new StreamReader(@"C:\Users\karansha\Desktop\Karan Logs\20110717.txt");
string x = reader.ReadToEnd();

List<string> users = new List<string>();

Regex regex = new Regex(@"appGUID:\s*(?<value>.*?)\s");
MatchCollection matches = regex.Matches(x);

foreach (Match match in matches)
{
        var user = match.Groups["value"].Value;
        if (!users.Contains(user)) users.Add(user);
}
4

3 に答える 3

1

正規表現なしで LINQ を使用してすべてのユーザーを解析する:

var users = File.ReadAllLines("20110717.txt")
                .Select(line =>
                {
                    string guidPrefix = "appGUID:";
                    int index = line.IndexOf(guidPrefix);
                    return line.Substring(index + guidPrefix.Length + 1);
                })
                .Where(user => user != "null" && user != "wx")
                .ToList();

ログ形式が一貫していない場合 (通常、同じ形式に依存するべきではありません。柔軟性があるためです)、正規表現の方が適しています。行内の appGUID 位置の変更、またはテキストの大文字と小文字の変更を処理します。

Regex regex = new Regex(@"appGUID:\s*(?<user>\S+)", RegexOptions.IgnoreCase);
var users = File.ReadAllLines("data.txt")
                .Select(line => regex.Match(line))
                .Where(match => match.Success)
                .Select(match => match.Groups["user"].Value)
                .Where(user => user != "null" && user != "wx")
                .ToList();

更新:実際には、解析部分を別のメソッドに移動します。これはおそらく変更される可能性が高いためです。したがって、次のようなものがあります。

public List<string> GetUsersFrom(string fileName)
{
   return File.ReadAllLines(fileName)
              .Select(ParseUser)
              .Where(u => u != null && u != "null")
              .ToList();
}

private string ParseUser(string s) // Any implementation here
{
    var match = Regex.Match(s, @"appGUID:\s*(?<user>\S+)");
    if (!match.Success)
        return null;

    return match.Groups["user"].Value;
}

使用法:

var users = GetUsersFrom("20110717.txt").Where(u => u != "wx");
于 2013-03-07T06:36:11.023 に答える
0

これを使って

regularexpression.replace(@"(.*)?(wx|null)\b",.....)

それをstring.emptyに置き換えると、不要な行がすべて破棄されます。

StreamReader reader = new StreamReader(@"C:\Users\karansha\Desktop\Karan Logs\20110717.txt");
string x = reader.ReadToEnd();

List<string> users = new List<string>();

Regex regex = new Regex(@"(.*)?(wx|null)\b");
var newString = regex.Replace(x, String.Empty);

ハッピーコーディング

于 2013-03-07T06:28:54.530 に答える
0

この正規表現を試してください:

appGUID:\s*(?<value>wx|null)\s
于 2013-03-07T06:30:07.517 に答える