c# - 正则表达式替换:如何在替换中动态获取匹配长度
问题描述
有没有办法用匹配中找到的相同长度的字符替换匹配表达式?下面的代码更容易理解:
var input = "hello hellspawn, goto hell!";
var pattern = @"(hell)(?!o)";
var replacement = "****"; // is there a dynamic way to specify length here?
var replaced = Regex.Replace(input, pattern, replacement, RegexOptions.IgnoreCase);
我可以用火柴来做到这一点:
var sbInput = new StringBuilder(input);
var sb = new StringBuilder();
var matches = Regex.Matches(input, pattern, RegexOptions.IgnoreCase);
foreach (Match match in matches) {
sb.Length = 0;
for (var i = 0; i < match.Length; i++) {
sb.Append("*");
}
sbInput.Replace(match.Value, sb.ToString(), match.Index, match.Length);
}
var replaced = sbInput.ToString();
解决方案
这应该有效:
var replaced = Regex.Replace(input, pattern,
m => new string('*', m.Length),
RegexOptions.IgnoreCase);
推荐阅读
- java - 如何在特定时区的特定时间(如 12:00:00.000)获取日期实例?
- sql - 使用查询/代码动态创建的 SQL 作业
- java - 我应该如何在 Google Play 管理中心启用我的 AdMob 真实 ID?
- xamarin.forms - 有没有办法在 Xamarin Forms 中使用相机功能而无需下载任何额外的 NuGet 包?
- java - Spring Boot 应用程序未在外部 Tomcat 中启动(在 Tomcat 8.5 和 10 中均已尝试)
- canvas - 如何在画布中旋转渐变,注意:不是画布本身
- docker - 在同一个 Docker 网络中发出 HTTP 请求
- arm - 用于高速微控制器测试台控制器/数据采集器的系统架构
- azure - 从 Azure DevOps 设置应用服务连接字符串
- c# - 等待 for 循环完成