C# 替换第二次出现的?与一个&;
请任何人提供适当的代码,将字符串中仅“?”的第二个实例替换为“&” 我环顾了四周,但似乎还没做完,而且我对正则表达式一开始就不太感兴趣 谢谢更换:C# 替换第二次出现的?与一个&;,c#,regex,C#,Regex,请任何人提供适当的代码,将字符串中仅“?”的第二个实例替换为“&” 我环顾了四周,但似乎还没做完,而且我对正则表达式一开始就不太感兴趣 谢谢更换: (.*?\?.*?)(\?)(.*) 如果要使用正则表达式,请使用$1和$3。您可以使用索引of指定开始索引以查找第二个问号的索引,然后使用子字符串: var index = input.IndexOf('?', input.IndexOf('?') + 1); var ouput = string.Concat(input.Substring(0
(.*?\?.*?)(\?)(.*)
如果要使用正则表达式,请使用
$1和$3
。您可以使用索引of
指定开始索引以查找第二个问号的索引,然后使用子字符串
:
var index = input.IndexOf('?', input.IndexOf('?') + 1);
var ouput = string.Concat(input.Substring(0,index), "&", input.Substring(index + 1));
或:
您还可以编写扩展方法:
public static string ReplaceWith(
this string source,
char charToReplace,
int index)
{
if(source == null) throw new ArgumentNullException("source");
if (index == -1) return source;
var output = new char[source.Length];
for (int i = 0; i < source.Length; i++)
{
if (i != index) output[i] = source[i];
else output[i] = charToReplace;
}
return new string(output);
}
这里有一个方法来处理这个重载
var regex = new Regex(@"(^.*?\?.*?)(\?)");
var r = regex.Replace("asdf ? fdas ? jkl ?", m => m.Groups[1] + "&", 1).Dump();
// asdf ? fdas & jkl ?
最简单的
Regex
可能是:
var regex = new Regex(@"(\?.*?)\?");
var test = "asdf?a=5?b=6&c=2";
test = regex.Replace(test, @"$1&"); // asdf?a=5&b=6&c=2
var test2 = "asdf?a=5?b=6?c=2";
test2 = regex.Replace(test, @"$1&"); // asdf?a=5&b=6?c=2
它将用
&
替换第二个?
,但如果第三个/第四个/etc存在,则不替换。请参考下面的示例,其中我从给定字符串中删除了第二个和第三个出现的$
string s = "like for example $ you don't have $ network $ access";
Regex rgx = new Regex("\\$\\s+");
s = Regex.Replace(s, @"(\$\s+.*?)\$\s+", "$1$$");
只需使用IndexOf,在第二次出现时,替换如果这是用于查询字符串解析,可能有更好的方法。相反的方法呢?只写&然后将第一个替换为?@RononDex-如果字符串中有3个或更多
?
,该怎么办?告诉编写进程以修复其代码的人此输出可能是错误的(或可能引发异常),因为有时可能只有一个或没有问题marks@LoganMurphy-不是根据OP的问题,但绝对值得注意。@LoganMurphy在第一个解决方案中,您是对的,这可以通过简单的检查if(index!=-1)
来解决,但如果没有问号或一个问题,第二个将只返回相同的字符串mark@Selman22这就是我可能实际做这件事的方式,对于这样一个简单的用例,不太需要使用正则表达式+1他们想要替换吗?这可能是$1和$3
?这是如何回答这个问题的?
var regex = new Regex(@"(\?.*?)\?");
var test = "asdf?a=5?b=6&c=2";
test = regex.Replace(test, @"$1&"); // asdf?a=5&b=6&c=2
var test2 = "asdf?a=5?b=6?c=2";
test2 = regex.Replace(test, @"$1&"); // asdf?a=5&b=6?c=2
string s = "like for example $ you don't have $ network $ access";
Regex rgx = new Regex("\\$\\s+");
s = Regex.Replace(s, @"(\$\s+.*?)\$\s+", "$1$$");