首页 > 解决方案 > 删除成绩单数据 C# 中的时间模式

问题描述

我正在阅读 C# 中的脚本文本文件,如下所示。删除时间模式并仅将文本和表单提取为段落的最佳方法是什么。

如下所述,实现输出的最佳方法是什么?常用表达?

成绩单文件的输入如下:

 0:0:0.0 --> 0:0:0.820
 Really.

 0:0:1.840 --> 0:0:4.400
 I have meeting on 10th August 2020 at 10 A.M.

0:1:59.670 --> 0:2:1.720
I can extract  text without time pattern.

0:2:3.450 --> 0:2:7.280
All seems good.

输出:需要就像段落一样。

Really. I have meeting on 10th August 2020 at 10 A.M. I can see extract text without time pattern. All seems good.  

更新: 代码:

我可以像下面这样尝试,但我仍然觉得需要更好的优化代码。如果句子中没有日期或时间,我的代码似乎有效。

 var fileContent = File.ReadAllText(filePath, Encoding.UTF8);
        //removing HTML tags and spl. characters
        string removedHTMltagsContent = Regex.Replace(fileContent.Replace("&nbsp;", string.Empty).Replace("WEBVTT", "").Replace("-->", "").Replace(":", "").Replace(".",""), "<.*?>", String.Empty);

        //Removing all Digits
        var output = Regex.Replace(removedHTMltagsContent, @"[\d-]", string.Empty);

        //removing all multiple empty lines
        string resultString = Regex.Replace(output, @"^\s+$[\r\n]*", string.Empty, RegexOptions.Multiline);

        Console.WriteLine(resultString);

标签: c#.netregexvisual-studioreplaceall

解决方案


您可以将类似时间的模式与-->带有前导和尾随空白字符的模式匹配以将其删除,或者将非空白字符匹配到该行的其余部分以保留在一个组中。

(?:\s*\d+:\d+:\d+\.\d+ -->.*\s*|\G)(\S.*)\s*

解释

  • (?:非捕获组
    • \s*\d+:\d+:\d+\.\d+ -->.*\s*将类似时间的模式与前导和尾随空格字符匹配
    • |或者
    • \G在上一场比赛结束时断言位置
  • )关闭非捕获组
  • (\S.*)\s*匹配非空白字符和行的其余部分,后跟 0+ 空白字符

正则表达式演示| .NET 演示

在替换中使用空格和组 1 $1

如果有前导空格,您可以修剪字符串以将其删除。

在此处输入图像描述

示例代码

string pattern = @"(?:\s*\d+:\d+:\d+\.\d+ -->.*\s*|\G)(\S.*)\s*";
string input = @"...";
            
Console.WriteLine(Regex.Replace(input, pattern, " $1").Trim());

输出

Really. I have meeting on 10th August 2020 at 10 A.M. I can extract  text without time pattern. All seems good.

推荐阅读