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

本文关键字:字符串 替换 正则表达式 | 更新日期: 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的一次或多次出现"