首页 > 解决方案 > 为什么 C# RegEx 类不尊重 Environment.NewLine?

问题描述

我正在使用 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设置?如果是这样,我该如何设置?

标签: c#regexnewline

解决方案


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

您可以使用

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

请参阅正则表达式演示

在此处输入图像描述

细节

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

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


推荐阅读