C# 如何仅在使用.NET匹配另一个单独筛选器时执行正则表达式替换?
给定一个与C# 如何仅在使用.NET匹配另一个单独筛选器时执行正则表达式替换?,c#,.net,regex,C#,.net,Regex,给定一个与/dir1/匹配的字符串(路径),我需要用破折号替换所有空格 例如:/dir1/带空格的路径应变为/dir1/带空格的路径 这可以很容易地在两个步骤中完成 var rgx = new Regex(@"^\/dir1\/"); var path = "/dir1/path with spaces"; if (rgx.isMatch(path)) { path = (new Regex(@" |\%20")).Replac
/dir1/
匹配的字符串(路径),我需要用破折号替换所有空格
例如:/dir1/带空格的路径
应变为/dir1/带空格的路径
这可以很容易地在两个步骤中完成
var rgx = new Regex(@"^\/dir1\/");
var path = "/dir1/path with spaces";
if (rgx.isMatch(path))
{
path = (new Regex(@" |\%20")).Replace(path, "-");
}
不幸的是,应用程序已经用一个简单的正则表达式替换构建,无法修改,所以我需要让正则表达式来完成这项工作。我想我在这里找到了答案:
并且能够创建和测试(?:\G(?)| ^(?=\/dir1\/.$).\K(|\%20)
,但后来我知道它在这个应用程序中不起作用,因为\K
是一个无法识别的转义序列(在.NET中不受支持)
我也尝试了积极的查找,但是我无法让它替换所有的空格(只有最后一个如果匹配是贪婪的,或者第一个如果不是贪婪的)。我可以设置足够的检查来处理最大数量的空格,但只要我检查10个空格,就会有人通过一条包含11个空格的路径
对于这个问题,是否有一个只适用于正则表达式的解决方案可以在.NET引擎中使用?您可以利用.NET中的无限宽度查找模式:
Regex.Replace(path, @"(?<=^/dir1/.*?)(?: |%20)", "-")
Regex.Replace(path,@)(?非常好用,谢谢。我应该使用.NET测试仪,我可能会偶然发现这个解决方案。但是,就我的教育而言,为什么*?
中的?
?为什么(?:|%20)
,而不仅仅是(|%20)
?@thadmiller(?:…)
是一个非捕获组,因为您不需要捕获组的值,也不需要捕获值。我使用*?
是出于习惯,*
将以类似的方式在这里工作。