簡體   English   中英

如何修改它以使用任何帶有捕獲組的正則表達式?

[英]How can I modify this to work with any regex with capture groups?

因為我在下面的代碼中使用了命名組,所以它只適用於特定的正則表達式。 如何修改它以將任何正則表達式和 output 所有捕獲組作為 csv?

Regex rg = new Regex(@"", RegexOptions.Compiled | RegexOptions.IgnoreCase);
try
{
    rg = new Regex(@arguments.Regex, RegexOptions.Compiled | RegexOptions.IgnoreCase);
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}
StringBuilder sb = new StringBuilder();
foreach (string line in System.IO.File.ReadLines(@arguments.FilePath))
//audit.log
{
    var loginMatch = rg.Match(line);
    if(!loginMatch.Groups["username"].Value.Equals(""))
    {
    sb.Append($"{loginMatch.Groups["username"].Value},{loginMatch.Groups["time"].Value},");
    }
}
Console.Out.WriteLine(sb.ToString());

例如,使用循環或 LINQ 枚舉loginMatch.Groups

for(int i = 1; i < loginMatch.Groups.Count; i++)
  sb.Append($"{g[i].Value},");
sb.Length--; //trim off last comma
sb.AppendLine();

或者

sb.AppendLine(string.Join(",", loginMatch.Groups.Cast<Group>().Skip(1).Select(g => g.Value)));

鑒於Group.ToString()也返回值,我懷疑這些也可以簡化一些,例如..

for(int i = 1; i < loginMatch.Groups.Count; i++)
  sb.Append(g[i]).Append(",");

加上修剪/換行符,或

string.Join(",", loginMatch.Groups.Cast<Group>().Skip(1));

加上sb


如果您命名了一些組但沒有命名其他組,並且您不知道名稱是什么,但只想將命名的組放在 CSV 中,請打開RegexOptions.ExplicitCapture並刪除 Skip/set the loop to start從 0 開始。 Skip/1 用於避免在文件中包含默認捕獲(輸入),但如果您只有顯式捕獲,則不會有默認組,因此您的捕獲將從 0 開始

完全同意 Enigmativity 的評論; 使用 CSV 編寫器庫,或者使此代碼更多地涉及數據中的 escaping 逗號等。我沒有在帖子中添加這種復雜性,因為我專門解決了如何枚舉捕獲組的查詢

正則表達式(縮寫為 regex 或 regexp;[1] 也稱為有理表達式 [2][3])是指定文本中的搜索模式的字符序列。 通常此類模式被字符串搜索算法用於字符串的“查找”或“查找和替換”操作,或用於輸入驗證。 它是理論計算機科學和形式語言理論中發展起來的一種技術。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM