8

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

例如

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"
}

我知道我们可能可以在这里使用正则表达式,但我无法在第二个实例上获得替换。谁能帮我一把?

4

6 回答 6

15

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

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

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

int i = 1;
string output = Regex.Replace(input, @"title1", m => "title" + i++);
于 2013-06-26T16:45:06.307 回答
3

您可以使用正则表达式替换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);
于 2017-04-12T08:08:56.487 回答
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);
于 2013-06-26T16:47:23.380 回答
1

您也许可以使用负前瞻:

title1(?!.*title1)

并替换为title2.

看看它是如何在这里工作的。

于 2013-06-26T16:44:18.163 回答
0

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

C# - indexOf第n次出现的字符串?

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

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

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

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

于 2013-06-26T16:56:51.960 回答
0

PSWG 的做法真的很棒。但在下面我提到了一种简单的方法来为那些在 lambda 和正则表达式中遇到问题的人完成它..;)

int index = input.LastIndexOf("title1=");

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

于 2013-06-26T18:16:06.130 回答