2013-06-26 2 views
6

У меня есть строка, которая может содержать «title1» дважды в ней.Как заменить определенное вхождение строки в строке?

например.

сервер/API/шоу? Title1 = его всегда солнечно в Филадельфии & title1 = Breaking Bad ...

Мне нужно изменить второй экземпляр слова "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 здесь, но я не могу получить замену во втором экземпляре. Может ли кто-нибудь дать мне руку?

+4

Если есть 3 экземпляра слова 'title1', вам нужно изменить третий на' title3'? –

+0

Это звучит для меня более широко. –

+0

у него НИКОГДА не будет более двух экземпляров –

ответ

10

Это будет только заменить второй экземпляр title1 (и все последующие экземпляры) после того, как первый:

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

Однако, если есть более чем 2 экземпляра, это не может быть то, что вы хотите. Это немного грубо, но вы можете сделать это, чтобы обрабатывать любое количество вхождений:

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

im, проверяющий это сейчас –

+0

. Спасибо, сэр! –

+0

pswg, я знаю, что я уже принял ваш ответ, но я просто попытался сделать то же самое, но со словом «episodetitle1», и это не дает мне таких же результатов. Ухаживать за другой рукой? callURL = Regex.Replace (callURL, @ "(? <= episodetitle1. *) episodetitle1", "episodetitle2"); –

1

Вы могли бы, возможно, сделать использование отрицательного предпросмотра:

title1(?!.*title1) 

И заменить title2.

Посмотрите, как это работает here.

+0

Что делать, если у него есть один заголовок .. вы замените неправильный – Anirudha

+0

@Anirudh Пользователь уже убедился в 'if', что есть два экземпляра 'title1'. – Jerry

+0

он говорит, что у него никогда не будет более двух экземпляров. – Anirudha

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); 
+0

Это хороший подход, но зачем вы используете регулярное выражение на последнем шаге? Вы можете просто выполнить команду 'string.Replace'. –

+0

@ p.s.w.g имеет 'string.Replace' поле с указанием, где вы начинаете поиск? –

+0

Нет, ты прав. Вам нужно будет сделать пару «string.Substring» (например, один ответ, который теперь удален). –

0

Я нашел эту ссылку сразу на поиск в Google.

C# - indexOf the nth occurrence of a string?

Получить IndexOf первое вхождение строки.

Используйте начальную позицию IndexOf startIndex +1 для начальной позиции второго IndexOf.

Подставлять его в две строки с соответствующим индексом символа «1».

Включите его вместе с символом «2».

0

Путь P.S.W.G был действительно потрясающим. но ниже я упомянул один простой способ сделать это для тех, у кого проблемы с лямбдой и выражением регулярных выражений ..;)

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

Строка output4 = input.Substring (0, index - 1) + "& title2" + input.Substring (index + "title1" .Length, input.Length - index - "title1".Длина);

0

Вы можете использовать регулярное выражение замены 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); 
0

Ниже приведен метод расширения 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" 

ИЛИ

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

будет производить ниже.

"computer or user, workstation and description" 

Я надеюсь, что это поможет кому-то еще, у кого был тот же вопрос.

Смежные вопросы