使用正则表达式替换字符串

时间:2016-08-18 11:31:51

标签: c# regex string

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

3 个答案:

答案 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解码。

答案 1 :(得分:2)

您的正则表达式%20(%20)?匹配%20,然后是1或0(可选)%20子字符串。

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

您还可以使用拆分和连接的非正则表达式方法。

请参阅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对)以创建用于保持捕获值的堆栈(仅用于简化匹配),则最好使用(...)一点)。

答案 2 :(得分:1)

我认为你的RegEx错了。

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

您的RegEx为%20(%20)?这意味着“一次出现%20加零或出现%20”您可以看到在其中找到了其中的4个。

您应该使用的RegEx是(%20)+这意味着“一次或多次出现%20