在.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之间的限定符。没有任何变化改变了输出。
答案 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)