c# - 为什么 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
设置?如果是这样,我该如何设置?
解决方案
$
锚点是一个正则表达式结构。( Environment.NewLine
"\r\n
用于非 Unix 平台,或\n
用于 Unix 平台") 不在正则表达式库中引用,它是一个单独的属性。
您可以使用
Regex.Replace(s, @"\d+(?=\r?$)", "[$&]", RegexOptions.Multiline)
请参阅正则表达式演示:
细节
\d+
- 1+ 位数(?=\r?$)
- 后面是可选的 CR,然后是行尾。
关键是当您使用锚点时,它RegexOptions.Multiline
会匹配 LF ( ) 符号$
之前的位置。\n
没有办法重新定义这种行为。Environment.NewLine
Windows 中的插入CRLF
行尾序列,因此您得到\r\n
行尾。因此,添加\r?
之前$
是匹配行尾位置的有效方法。
推荐阅读
- java - 实现类导致“重复类错误
- junit - jMockit 代码覆盖工具:如何在 Eclipse 运行配置中激活?
- python - 关于为什么列表列表的处理失败的问题
- javascript - Array.fill 函数在反应中不起作用
- javascript - 删除 EventListener 上的转换:
- markdown - 构造一个包含许多节和小节的 Markdown 文件
- material-ui - material-ui 创建许多重复的类
- curl - 带有用户名/密码身份验证的 curl 失败
- c# - 异步任务中的 ASP.NET EF Core 连接问题
- vbscript - 列出文件/子文件的名称、大小和创建日期?