【问题标题】:C# remove line using regular expression, including line breakC#使用正则表达式删除行,包括换行
【发布时间】:2020-01-06 20:29:23
【问题描述】:

我需要从某些文本中删除与特定模式匹配的行。一种方法是使用带有开始/结束锚点的正则表达式,如下所示:

var re = new Regex("^pattern$", RegexOptions.Multiline);
string final = re.Replace(initial, "");

这很好用,只是它留下一个空行而不是删除整行(包括换行符)。

为了解决这个问题,我为换行添加了一个可选的捕获组,但我想确保它包含所有不同风格的换行,所以我这样做了:

var re = new Regex(@"^pattern$(\r\n|\r|\n)?", RegexOptions.Multiline);
string final = re.Replace(initial, "");

这可行,但似乎应该有一种更直接的方法来做到这一点。有没有更简单的方法可以可靠地删除整行,包括结束换行符(如果有)?

【问题讨论】:

  • 好吧,@"^pattern$[\s-[\p{Zs}\t]]*" 会满足您的需求。确保 CR 匹配,可能@"^pattern\r?$[\s-[\p{Zs}\t]]*" 会做得更好。

标签: c# regex


【解决方案1】:

要匹配任何单个换行符序列,您可以使用(?:\r\n|[\r\n\u000B\u000C\u0085\u2028\u2029]) 模式。因此,您可以使用(?:\r\n|[\r\n\u000B\u000C\u0085\u2028\u2029])?,而不是(\r\n|\r|\n)?

详情:

  • ‎000A - 换行符,\n
  • ‎000B - 一行制表符
  • ‎000C - 换页符
  • ‎000D - 回车,\r
  • ‎0085 - 下一行字符,NEL
  • ‎2028 - 行分隔符 ‎- 2029 - 段落分隔符。

如果您想在匹配的行之后删除任何 0+ 个非水平(或垂直)空白字符,您可以使用 [\s-[\p{Zs}\t]]*:任何空白 (\s) 但 (-[...]) 水平空白(匹配与[\p{Zs}\t])。请注意,由于某种原因,\p{Zs} Unicode 类别类与制表符不匹配。

由于您使用的是RegexOptions.Multiline 选项,因此必须在此处处理另一个方面:它使$ 在换行符(\n)或字符串结尾之前匹配。这就是为什么如果你的行结尾是 CRLF 模式可能无法匹配。因此,在您的模式中,在 $ 之前添加一个可选的 \r?

所以,要么使用

@"^pattern\r?$(?:\r\n|[\r\n\u000B\u000C\u0085\u2028\u2029])?"

@"^pattern\r?$[\s-[\p{Zs}\t]]*"

【讨论】:

  • 绝对不是一个更简单的解决方案,但在可靠性方面全力以赴的荣誉。您提到的一件事促使我仔细检查文档,然后进行一些测试。原来$ 锚点只匹配\n。所以\r 不算作换行,而\r 在删除^...$ 划定的行时总是会被删除。我还抽查了您提出的其他一些行尾字符,没有一个与$ 匹配。因此,对于我最初的问题,似乎只需删除 \n 就足够了。
  • @JackA。只是为了更正一个重要的位:$ 在提供Multiline 选项时匹配\n 之前的位置\r - 如果有 - 必须与 pattern 一起使用。你没有解释模式是什么,也许它以.*结尾,那么你真的不需要任何\r?。我的回答是一个通用的问题,我认为您的问题是匹配任何换行序列或任何换行符号(垂直空格)
猜你喜欢
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
相关资源
最近更新 更多