【问题标题】:How to delete or replace multiple line text from the text file using regex matching in C#如何在 C# 中使用正则表达式匹配从文本文件中删除或替换多行文本
【发布时间】:2019-02-27 15:43:32
【问题描述】:

我有以下带有很多类似文本模式的文本文件(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

使用以下表达式,我可以映射必要的示例(第一个)。 不幸的是,我不知道如何使用 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# 根据正则表达式删除/替换文本 - 如何执行此操作?
  • 保存输出(无示例1)

    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);
    

预期的输出结果.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 个长字符串的版本。

抱歉解释不清楚。

【问题讨论】:

  • 从你的问题中不清楚你想做什么。请重新阅读并至少添加预期结果。
  • 你的例子有点不清楚。如果您显示一个 实际 示例文件内容的代码块,然后显示另一个具有预期结果的代码块,将会更有帮助。你说你有以下文本文件,然后显示一个代码块,其中包含像ExampleX 这样的字符串。那是文件的一部分吗?是什么决定了一段相关文本? “未使用的文本”是什么意思?
  • 暂时以“不清楚”为由否决,更新后请评论,我会删除!
  • 更新并添加示例
  • 所以文件实际上包含像"Example3 - Should NOT be Removed"这样的字符串?这就是定义一个文本区域以与其他文本进行比较的原因吗?问题是,您如何在文件中定义文本区域,以便将它们相互比较。很难判断您给出的示例是否是实际文本文件内容

标签: c# regex text


【解决方案1】:

您可以使用例如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 次匹配换行符、可选空格或制表符,然后再匹配一个换行符。之后匹配任何字符 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);

【讨论】:

  • 非常感谢。我已经仔细检查了你的建议,似乎它符合我的目的。
【解决方案2】:

不清楚你想用这个文件做什么。 无论如何,我会尽力回答。

如果你想通过识别来替换一些文本,你可以这样做:

例子

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 中的所有字符串。换句话说,如果下面没有任何其他文本,我需要删除一组字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
相关资源
最近更新 更多