使用正则表达式替换字符串
本文关键字:字符串 替换 正则表达式 | 更新日期: 2023-09-27 18:02:51
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
您非常接近-使用(%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解码。
您的regex %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
是一个好主意。
我想你的正则表达式写错了。
Regex.Replace()
函数是一个贪心函数,它将始终尝试找到与RegEx对应的最大字符串。
您的RegEx是%20(%20)?
,这意味着"%20
的一次出现加上零或%20
的一次出现",正如您可以看到的,您在字符串中找到了4个。
您应该使用的RegEx是(%20)+
,这意味着" %20
的一次或多次出现"