Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 当下一行不是以给定字符串开头时,Regex将删除换行符_.net_Regex - Fatal编程技术网

.net 当下一行不是以给定字符串开头时,Regex将删除换行符

.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

在.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",""
附录:在尝试了建议的模式之后——注意到该模式对于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);