Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何仅在使用.NET匹配另一个单独筛选器时执行正则表达式替换?_C#_.net_Regex - Fatal编程技术网

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
(?:…)
是一个非捕获组,因为您不需要捕获组的值,也不需要捕获值。我使用
*?
是出于习惯,
*
将以类似的方式在这里工作。