当下一行不以给定字符串

时间:2018-03-11 22:06:03

标签: .net regex

在.net中工作我正在解析一个日志文件,其中某些行不以'“2018'开头。我需要一个.Match子句,它将找到除了字符串”2018之外的所有行的行(请注意包括双引号)。找到后(这是棘手的一点) - 在违规行之前删除行中的换行符。换句话说,将违规行添加到其上方的行中。

"2018-02-22 10:06:10,857","[7]"," ERROR","MyApp.Web.Infrastructure.ErrorResponseCommand","ErrorResponseCMD logs Controller: webinar | Action: Index",""
"2018-02-22 10:06:37,742","[11]"," INFO ","MyApp.Web.MvcApplication","Anon Session Starts with: {""FirstPage"": ""https://www.bankwebinars.com/wp-login.php"", ""QueryString"": """", ""SessionId"": ""uhnev2dnds33dastwrdgftvm"", ""FirstCookies"": {""CookieName"": ""ASP.NET_SessionId"", ""Value"": ""uhnev2dnds33dastwrdgftvm""}}",""
"2018-02-22 10:06:48,053","[11]"," INFO ","MyApp.Web.Controllers.CartController","SessionInfo{
  ""FirstPage"": null,
  ""RemoteAddress"": ""207.46.13.159"",
  ""RemoteHost"": ""207.46.13.159"",
  ""RemoteUser"": """",
RelativeConfirmPasswordResetUrl:Account/PasswordResetConfirm
//and other non-predictable BOL patterns.
},""
"2018-02-22 10:06:10,857","[7]"," ERROR","MyApp.Web.Infrastructure.ErrorResponseCommand","ErrorResponseCMD logs Controller: webinar | Action: Index",""

ADDENDUM:尝试了建议的模式 - 并注意到该模式对regex101的沙箱正常工作 - 必然会出现其他问题。这是我目前的代码。

string str = File.ReadAllText("myLog.log");            
Regex rx = new Regex("(?m)\r?\n^(?!\"2018)", RegexOptions.Singleline);
str = rx.Replace(str, "\"2018");            
File.WriteAllText("test1.txt", str);

我在模式上尝试了很多变化 - 例如我认为RegexOption子句等同于(?m)短语,所以我试图省略它。单行应该是我想要的,因为它将整个文件视为单行,但我也尝试过多行模式。这是一个Windows文件,所以?不应要求\ r和\ n之间的限定符。没有任何变化改变了输出。

3 个答案:

答案 0 :(得分:1)

这是正则表达式替换它的工作:

str = Regex.Replace(str, @"\r?\n(?!""2018)", String.Empty);

问题中的以下代码不正确:

Regex rx = new Regex("(?m)\r?\n^(?!\"2018)", RegexOptions.Singleline);
str = rx.Replace(str, "\"2018");

(?!\"2018)是一个负面的预测。与其他外观一样,它实际上并不捕获匹配的文本。这就是为什么rx.Replace(str, "\"2018")会导致向每个移动的字符串添加"2018的原因。例如输入:

"2018" Line 1
"2018" Line 2
  Sub-line 1
  Sub-line 2
"2018" Line 3

您将获得以下结果:

"2018" Line 1
"2018" Line 2"2018  Sub-line 1"2018  Sub-line 2
"2018" Line 3"2018

这就是为什么你应该用空字符串替换匹配的部分。在这种情况下,您将得到正确的结果:

"2018" Line 1
"2018" Line 2  Sub-line 1  Sub-line 2
"2018" Line 3

答案 1 :(得分:1)

您的代码可能存在自上而下的错误

1-我看到了File.ReadAllText() emphasizes的文档页面:

  

结果字符串不包含终止回车符   和/或换行。

如果这是问题,请看this thread,我不是.NET专家。

2-您需要在@-quote旁边caring about inner double quotation mark正则表达式字符串(""表示@ -quoted字符串中的"并删除s标记为好吧这是额外的。

Regex rx = new Regex(@"(?m)\r?\n^(?!""2018)");

3-接下来是您提供的替换字符串。你应该什么也不用。 Zero-Width Negative Lookahead Assertion断言并且不消耗:

str = rx.Replace(str, ""); 

<强> Live demo

答案 2 :(得分:0)

通过执行以下操作,我能够得到我认为理想的结果:

Regex.Replace(logString, @"\r\n\s\s", "", RegexOptions.Multiline)