.net 当下一行不是以给定字符串开头时,Regex将删除换行符
在.net中工作时,我正在解析一个日志文件,其中有些行不以“2018”开头。我需要一个.Match子句,该子句将查找除字符串“2018”之外的任何行(注意,其中包括双引号)。当被发现时(这是一个棘手的问题)——在有问题的一行之前删除该行的换行符。换言之,在其上方的行中添加有问题的行.net 当下一行不是以给定字符串开头时,Regex将删除换行符,.net,regex,.net,Regex,在.net中工作时,我正在解析一个日志文件,其中有些行不以“2018”开头。我需要一个.Match子句,该子句将查找除字符串“2018”之外的任何行(注意,其中包括双引号)。当被发现时(这是一个棘手的问题)——在有问题的一行之前删除该行的换行符。换言之,在其上方的行中添加有问题的行 "2018-02-22 10:06:10,857","[7]"," ERROR","MyApp.Web.Infrastructure.ErrorResponseCommand","ErrorResponseCMD l
"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",""
附录:在尝试了建议的模式之后——注意到该模式对于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之间的限定符。所有变化都没有改变输出。我通过执行以下操作,获得了我认为理想的结果:
Regex.Replace(logString, @"\r\n\s\s", "", RegexOptions.Multiline)
下面是执行此任务的regex replace:
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-我看到了文件的文档页。ReadAllText()
:
结果字符串不包含终止回车符
和/或换行
如果这是问题所在,请看一看,我不是.NET大师
2-您需要在(“
表示带引号的字符串中的”
)旁边正则表达式字符串,并删除s
标志,这是额外的
Regex rx = new Regex(@"(?m)\r?\n^(?!""2018)");
3-接下来是您提供的替换字符串。你应该什么都不替换。A断言但不消耗:
str = rx.Replace(str, "");
那么您的模式有什么问题?或者更确切地说,您尝试过的模式是什么?根据提供的示例的简短片段,是的,您的答案就足够了。我已经编辑了OP,以包含更多需要适应的变化。所有点都在现场。谢谢对于未来的人:问题1的解决方案是string str=File.ReadAllText(“myText.txt”,Encoding.ASCII);