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
答案 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);
很有可能,单凭正则表达式并不适合这项工作。该字符串看起来是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
”