如何在C#中使用正则表达式匹配从文本文件中删除或替换多行文本

时间:2019-02-27 15:43:32

标签: c# regex text

我有以下具有很多相似文本模式的文本文件(inputFile.txt):

 Example1 - Should be Removed (original file contains a lot of similar parts)

 Event Number (#)                

 string2

 string3

 string4


 Example2 -Should NOT be Removed

 Event Number (#)                

 string2

 string3

 string4
 string5



 Example3 - Should NOT be Removed

 Event Number (#)                
 AnyText
 string2

 string3

 string4

使用以下表达式,我可以映射必要的示例(第1个)。 不幸的是,我不知道如何使用C#从文本文件中删除此文本。

 Event number\n(^\s*$)\n(.*)\n(^\s*$)\n(.*)\n(^\s*$)\n(.*)\n(^\s*$)

用于分析的数据示例: https://gist.github.com/SeregaVRS/0d47e84607e5dc1b8e954c2c2cc50fad

您可以使用https://regex101.com来获取更多详细信息,我想使用正则表达式删除它

我想清理文件中的其他字词以删除未使用的示例:

删除格式:

 Event Number (#)                
 {Empty String}
 string2
 {Empty String}
 string3
 {Empty String} 
 string4
 {Empty String}

不应受到影响的示例:

 Event Number (#)                
 {Empty String}
 string2
 {Empty String}
 string3
 {Empty String} 
 string4
 string5

我遇到的大多数示例都与单行正则表达式匹配有关。

您知道如何使用C#代码从整个文件中删除/替换未使用的文本吗?

应该是这样的:

  • 读取输入文件(以下示例)
  • 使用C#根据正则表达式删除/替换文本-如何做到这一点?
  • 保存输出(无example1)

    string regexForEmptyNotes =
        @"string\n?(.*)\n(^\s*$)\n(.*)\n(^\s*$)\n(.*)\n(^\s*$)\n(.*)\n(^\s*$)";
    var fileLines = File.ReadLines(inputFileName, Encoding.Default);
    // Something should happened in this place :) 
    Regex.Replace("Expected string as an input but not strings collection", regexForEmptyNotes, string.Empty);
    File.WriteAllLines(outputFileName, fileLines, Encoding.UTF8);
    

预期的outputResult.txt

 Example2 -Should NOT be Removed

 Event Number (#)                

  string2

  string3

  string4
  string5



  Example3 - Should NOT be Removed

 Event Number (#)                
  AnyText
  string2

  string3

  string4

输出文件应仅包含Example2和Example3。 不幸的是,我应该保存格式,因此无法使用版本将文件中的所有文本转换为1个长字符串。

很抱歉,不清楚的解释。

2 个答案:

答案 0 :(得分:0)

不清楚您要对该文件做什么。 无论如何,我都会尝试回答。

如果要通过标识替换某些文本,可以执行以下操作:

示例

Example1 - Should be Removed (original file contains a lot of similar parts)

string

string2

 string3

 string4


 Example2 -Should NOT be Removed

 string

 string2

 string3

 string4
 string5



 Example3 - Should NOT be Removed

 string
 AnyText
 string2

 string3

 string4

要使用Regex删除Example1:

inputString = Regex.Replace(inputString , Regex.Escape("Example1"), Regex.Replace(string.Empty, "\\$[0-9]+", @"$$$0"), RegexOptions.IgnoreCase);

答案 1 :(得分:0)

您可能要做的是使用例如System.IO.File.ReadAllText将整个文本读取为一个字符串。然后进行替换,并使用例如System.IO.File.WriteAllText

将内容写回到相同或新文件中。

如果您希望在下一行没有文字时进行匹配,则可以使用:

^[ \t]*string(?:\n[ \t]*\n.*){3}$(?!\n[ \t]*\S)

说明

  • ^行的开头
  • [ \t]*匹配0+次空格或制表符
  • string字面上匹配
  • (?:\n[ \t]*\n.*){3}$重复3次,与换行符,可选的空格或制表符匹配,再与换行符匹配。之后,匹配任何char 0+次。
  • (?!\n[ \t]*\S)否定断言来断言以下内容不是换行符,空格/制表符和非空格字符。

例如:

var lines = File.ReadAllText("inputFile.txt", Encoding.Default);
var regex = new Regex(@"^[ \t]*string(?:\n[ \t]*\n.*){3}$(?!\n[ \t]*\S)", RegexOptions.Multiline);
var result = regex.Replace(lines, "");
File.WriteAllText(@"outputFile.txt", result);