如何替换字符串中特定字符串的出现?

时间:2013-06-26 16:37:52

标签: c# regex string

我有一个字符串,其中可能包含两次“title1”。

e.g。

  

server / api / shows?title1 =它在费城总是阳光充足& title1 =破坏......

我需要将单词“title1”的第二个实例更改为“title2”

我已经知道如何识别字符串中是否有两个字符串实例。

int occCount = Regex.Matches(callingURL, "title1=").Count;

if (occCount > 1)
{
     //here's where I need to replace the second "title1" to "title2"
}

我知道我们可以在这里使用Regex但是我无法在第二个实例上获得替换。任何人都可以帮我一把吗?

7 个答案:

答案 0 :(得分:12)

这只会在第一个实例之后替换title1(和任何后续实例)的第二个实例:

string output = Regex.Replace(input, @"(?<=title1.*)title1", "title2");

但是,如果有超过2个实例,则可能不是您想要的。这有点粗糙,但你可以这样做来处理任意数量的事件:

int i = 1;
string output = Regex.Replace(input, @"title1", m => "title" + i++);

答案 1 :(得分:2)

您可以指定一个计数,以及一个开始在

搜索的索引
string str = @"server/api/shows?title1=its always sunny in philadelphia&title1=breaking bad ...";

Regex regex = new Regex(@"title1");
str = regex.Replace(str, "title2", 1, str.IndexOf("title1") + 6);

答案 2 :(得分:1)

你也许可以使用负面的前瞻:

title1(?!.*title1)

并替换为title2

了解它是如何运作的here

答案 3 :(得分:1)

您可以使用正则表达式替换MatchEvaluator并为其指定“状态”:

string callingURL = @"server/api/shows?title1=its always sunny in philadelphia&title1=breaking bad";

int found = -1;
string callingUrl2 = Regex.Replace(callingURL, "title1=", x =>
{
    found++;
    return found == 1 ? "title2=" : x.Value;
});

使用后缀++运算符(非常难以理解),替换可以是一行的。

string callingUrl2 = Regex.Replace(callingURL, "title1=", x => found++ == 1 ? "title2=" : x.Value);

答案 4 :(得分:1)

这是我为类似任务创建的C#扩展方法,可能会派上用场。

internal static class ExtensionClass
{
    public static string ReplaceNthOccurance(this string obj, string find, string replace, int nthOccurance)
    {
        if (nthOccurance > 0)
        {
            MatchCollection matchCollection = Regex.Matches(obj, Regex.Escape(find));
            if (matchCollection.Count >= nthOccurance)
            {
                Match match = matchCollection[nthOccurance - 1];
                return obj.Remove(match.Index, match.Length).Insert(match.Index, replace);
            }
        }
        return obj;
    }
}

然后您可以使用以下示例。

"computer, user, workstation, description".ReplaceNthOccurance(",", ", and", 3)

将产生以下结果。

"computer, user, workstation, and description"

OR

"computer, user, workstation, description".ReplaceNthOccurance(",", " or", 1).ReplaceNthOccurance(",", " and", 2)

将产生以下内容。

"computer or user, workstation and description"

我希望这可以帮助那些有同样问题的人。

答案 5 :(得分:0)

我在谷歌搜索中立即找到了这个链接。

C# - indexOf the nth occurrence of a string?

获取IndexOf第一次出现的字符串。

使用返回的IndexOf的startIndex +1作为第二个IndexOf的起始位置。

在“1”字符的适当索引处将其子串到两个字符串中。

将它与“2”字符连接起来。

答案 6 :(得分:0)

P.S.W.G的做法非常棒。但是在下面我提到了一个简单的方法来为那些在lambda和regex表达式中遇到问题的人完成它。;)

int index = input.LastIndexOf(“title1 =”);

string output4 = input.Substring(0,index - 1)+“&amp; title2”+ input.Substring(index +“title1”.Length,input.Length - index - “title1”.Length);