【问题标题】:Why doesn't C# RegEx class respect Environment.NewLine?为什么 C# RegEx 类不尊重 Environment.NewLine?
【发布时间】:2021-02-15 05:28:12
【问题描述】:

我正在使用 C# 交互,这里是设置:

#r "System.Text.RegularExpressions"
using System.Text.RegularExpressions;
string s = "Number 42" + Environment.NewLine + "and 1 number 3";

我希望在行尾或字符串末尾的所有数字周围添加括号(42 和 3 都应该有括号)。

注意:在我的系统上 Environment.NewLine\r\n

所以我尝试Regex.Replace(s, "(\\d+)$", "[$0]", RegexOptions.Multiline) 并且只有 3 个被包装。

如果我这样做 Regex.Replace(s, "(\\d+)\r?$", "[$0]", RegexOptions.Multiline) 两者都被包裹,但一个在括号内有一个额外的 \r。所以正则表达式引擎相信 Environment.NewLine\n 的谎言。

是否有单独的 Environment.NewLine 设置仅用于正则表达式?如果是这样,我该如何设置?

【问题讨论】:

  • @WiktorStribiżew 但不应该是不必要的吗?
  • $ 只是在寻找\nEnvironment.NewLine\r\n 所以(\\d+)$ 是不够的,因为\r 把你搞砸了。
  • 这里有类似的问题:stackoverflow.com/q/8618557/5311735。简而言之,它就是这样工作的,可能是因为正则表达式在 .NET 之前有很长的历史,所以要与所有其他实现保持一致。
  • @Evk 这是一个值得欺骗的目标。
  • 实际上,这只是该线程的部分欺骗,因为在这里,数字必须用括号括起来而没有 CR 符号(当前的 OP 正则表达式实际上并没有满足 OP 的需要)。

标签: c# regex newline


【解决方案1】:

$ 锚是一个正则表达式结构。 Environment.NewLine(“\r\n 用于非 Unix 平台,\n 用于 Unix 平台”)不在正则表达式库中引用,而是一个单独的属性。

你可以使用

Regex.Replace(s, @"\d+(?=\r?$)", "[$&]", RegexOptions.Multiline)

regex demo

详情

  • \d+ - 1 位以上
  • (?=\r?$) - 后面是可选的 CR,然后是行尾。

关键是,当您使用RegexOptions.Multiline 时,$ 锚点匹配 LF (\n) 符号之前的位置。没有办法重新定义这种行为。 Windows 中的 Environment.NewLine 插入 CRLF 行尾序列,因此您将 \r\n 作为行尾。因此,在$ 之前添加\r? 是匹配行尾位置的有效方法。

【讨论】:

  • 那么$和Environment.NewLine有什么关系呢?没有?
  • @NH。 $ 是一个正则表达式结构。 Environment.NewLine(“\r\n 用于非 Unix 平台,或 \n 用于 Unix 平台。”)是一个 .NET 属性,它不是一部分,也不能在正则表达式库中引用.
猜你喜欢
  • 1970-01-01
  • 2013-10-17
  • 2015-03-14
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2014-03-03
  • 1970-01-01
相关资源
最近更新 更多