2016-08-18 45 views
1
text = "The%20%20%20%20%20%20%20%20%20%20Park" 
text = "The%20Park" 

即使文本有一个%20或多个,它应该有单个字符'-'The-Park使用正则表达式替换字符串

var regex = new Regex("%20(%20)?"); 
var output = regex.Replace("The%20%20%20%20%20%20%20%20%20%20Park", "-"); 
output = The----Park 

但输出应该The-Park

+2

'“%20(%20)?”' - >'“%20(%20)*”' - >'“(%20)+”' –

+0

@WiktorStribiżew,谢谢它的正常工作。 – sagivasan

+0

我添加了解释和替代非正则表达式解决方案的答案。 –

回答

2

你已经很接近 - 使用(%20)+表达以匹配一次或多次出现的%20

var regex = new Regex("(%20)+"); 
var output = regex.Replace("The%20%20%20%20%20%20%20%20%20%20Park", "-"); 
Console.WriteLine(output); 

Demo.

好机会,单独的正则表达式是不是为工作的工具。该字符串看起来是URL编码的,%20代表空格。在应用寻找空格的正则表达式之前,你最好先对URL进行URL解码。

+0

感谢和我的第一个正则表达式构建。它的URL编码。我需要'''而不是空间,以便我使用正则表达式。 – sagivasan

+0

@sagivasan我会解码,替换,并重新编码只是为了安全。 – dasblinkenlight

+1

如果重新编码,我会得到空间而不是'-' – sagivasan

1

我认为你的RegEx错误。

Regex.Replace()函数是一个贪婪的函数,它会一直试图找到与您的RegEx相对应的最大字符串。

你的正则表达式是%20(%20)?这意味着“的%20加零一个发生或%20一个出现”正如你可以看到你在字符串中找到它们的4。

你应该使用正则表达式是(%20)+这意味着

2

你的正则表达式“的%20一个或多个发生” %20(%20)?匹配的%20,然后1或0(可选)%20子。

要匹配零个或多个,您需要使用量词 - %20(%20)*。但是,这等于(%20)+,因为+匹配1个或多个量化子模式。

您也可以使用非正则表达式方式进行拆分和连接。

C# demo

var s = "The%20%20%20%20%20%20%20%20%20%20Park"; 
var regex = new Regex("(%20)+", RegexOptions.ExplicitCapture); 
var output = regex.Replace(s, "-"); 
Console.WriteLine(output);   // => The-Park 

output = string.Join("-", s.Split(new[] {"%20"}, StringSplitOptions.RemoveEmptyEntries)); 
Console.WriteLine(output);   // => The-Park 

要注意的是使用RegexOptions.ExplicitCapture如果你不想捕获组(对转义(...))在你的模式创建一个堆栈保持捕获的值(只是个好主意蒸汽线匹配一点)。