c# - Regex.Replace 替换空匹配
问题描述
我使用以下正则表达式仅替换非空行(带空格的行不算为空)。
^(.+)$
使用多行选项。
根据 regex101 这应该可以工作:https ://regex101.com/r/S5Fcqw/1
但似乎 C#s 的正则表达式实现有点不同。我可以使用替换来完成这项工作还是需要查看匹配项?
这是电话:Regex.Replace(text, @"^(.+)$", " $1", RegexOptions.Multiline);
语言是 C# 7.2 和 net472 作为目标框架。
所以我现在找到了有问题的组合:
public static string IndentBy(this string text, int count, string indentationMarker = " ")
{
if (string.IsNullOrEmpty(text))
{
return text;
}
var spaces = string.Join(string.Empty, Enumerable.Repeat(indentationMarker, count));
var replacement = $"{spaces}$1";
var indented = Regex.Replace(text, @"^(.+)$", replacement, RegexOptions.Multiline);
return indented;
}
[InlineData("a", " a")]
[InlineData("a\nb", " a\n b")]
[InlineData("a\r\nb", " a\r\n b")]
[InlineData("a\n\nb", " a\n\n b")]
[InlineData("a\r\n\r\nb", " a\r\n\r\n b")] // this line fails
public void IndentBy_Input_GivesExpectedOutput(string input, string expected)
{
// act
var indentet = IndentBy(input, 4);
// assert
indentet.ShouldBe(expected);
}
解决方案
因此,解决方法是不依赖于$
匹配换行符,而是手动进行。
我现在使用:@"([^\r\n]+\r?\n?)"
with RegexOptions.SingleLine
(不确定是否有必要),它适用于我的用例。
推荐阅读
- java - java.io.FileNotFoundException:打开失败:EACCES(权限被拒绝),同时尝试使用 JobIntentService 记录
- java - 关键 PRINCIPAL_NAME_INDEX_NAME 的 Spring AWS 弹性缓存 Redis 会话超时/TTL 问题
- flutter - 重启 CircularCountdownTimer 颤振 onComplete
- wordpress - 页面子项不会出现在 wp_nav_menu 中
- python - python boto无法获取docker容器的环境变量
- python - 在 GPU(而不是 CPU)上运行对象检测算法的问题
- javascript - 通过数组映射后根据索引对对象数组进行排序
- javascript - 浏览器扩展兼容性 - 检查浏览器是 chrome 还是 firefox
- r - 尽管在 r 中使用 as.POSIXct 时间跨过午夜,但日期并没有改变
- c# - C# File System Watcher windows 服务发生内存泄漏,无法追踪导致内存泄漏的原因