Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 替换第二次出现的?与一个&;_C#_Regex - Fatal编程技术网

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$$");