2012-04-02 1 views
2

Я хочу заменить charecter в строке строкой в ​​C#. Я пробовал следующее:заменить символ в строке в C# на основе позиции со строкой

Здесь, в следующей программе, я хочу заменить набор charecters между charecters ':' и первым случаем '-' с некоторыми другими charecters.

Я смог извлечь набор charecters между ':' и первым случаем '-'.

Можно ли сказать, как вставить их обратно в исходную строку.

 string source= "tcm:7-426-8"; 
     string target= "tcm:10-15-2"; 
     int fistunderscore = target.IndexOf("-"); 
     string temp = target.Substring(4, fistunderscore-4); 
     Response.Write("<BR>"+"temp1:" + temp + "<BR>"); 

Примеры:

 source: "tcm:7-426-8" or "tcm:100-426-8" or "tcm:10-426-8" 

     Target: "tcm:10-15-2" or "tcm:5-15-2" or "tcm:100-15-2" 

     output: "tcm:10-426-8" or "tcm:5-426-8" or "tcm:100-426-8" 

В двух словах, я хочу, чтобы заменить набор charectes между ':' и '-' (firstoccurance) и charecters extracetd из того же рода строки.

Может любая помощь, как это можно сделать.

спасибо.

+0

Ваши примеры, кажется, заменить подстроку между двумя дефисы (-); это не соответствует вашему описанию того, что вы хотите. – Polyfun

+0

См. Ответ на [этот вопрос] (http: // stackoverflow.com/questions/141045/how-do-i-replace-the-first-instance-of-a-string-in-net) – Deco

ответ

0

Попробуйте регулярки решения - сначала этот метод, принимает source и target строки и выполняет регулярное выражение заменить на первом, ориентируется первыми цифрами после «той», который должен быть закреплен в начало строки. В MatchEvaluator он снова выполняет одно и то же регулярное выражение, но в строке target.

static Regex rx = new Regex("(?<=^tcm:)[0-9]+", RegexOptions.Compiled); 

public string ReplaceOneWith(string source, string target) 
{ 
    return rx.Replace(source, new MatchEvaluator((Match m) => 
    { 
     var targetMatch = rx.Match(target); 
     if (targetMatch.Success) 
      return targetMatch.Value; 
     return m.Value; //don't replace if no match 
    })); 
} 

Обратите внимание, что никакая замена не выполняется, если регулярное выражение не возвращает совпадение в целевой строке.

Теперь запустите этот тест (вероятно, необходимо скопировать выше в тестовый класс):

[TestMethod] 
public void SO9973554() 
{ 
    Assert.AreEqual("tcm:10-426-8", ReplaceOneWith("tcm:7-426-8", "tcm:10-15-2")); 
    Assert.AreEqual("tcm:5-426-8", ReplaceOneWith("tcm:100-426-8", "tcm:5-15-2")); 
    Assert.AreEqual("tcm:100-426-8", ReplaceOneWith("tcm:10-426-8", "tcm:100-15-2")); 
} 
0

Я не ясно, по логике, используемой, чтобы решить, какой бит, из которых используется строка, но все же, вы должны использовать Split(), а не отвод о строковые смещениях: (обратите внимание, что Remove (0,4) есть, чтобы удалить ТСМ: префикс)

string[] source = "tcm:90-2-10".Remove(0,4).Split('-'); 
string[] target = "tcm:42-23-17".Remove(0,4).Split('-'); 

Теперь у вас есть цифры от обоих source и target в удобных для доступа к массивам, так что вы можете создать новую строку так, как вы хотите:

string output = string.Format("tcm:{0}-{1}-{2}", source[0], target[1], source[2]); 
+0

На основе примеров код должен быть 'string output = string.Format (" tcm: {0} - {1} - {2} ", цель [0], источник [1], источник [2]);' –

+0

Возможно. Это немного расплывчато, и три примера не совпадают. Но это не имеет значения - я не здесь, чтобы дать OP точный способ скопировать-вставить его код, но дать возможное решение. –

3

Если yo Вы хотите заменить первый «: Number-» из источника содержимым с целью, вы можете использовать следующее регулярное выражение.

var pattern1 = New Regex(":\d{1,3}-{1}"); 
    if(pattern1.IsMatch(source) && pattern1.IsMatch(target)) 
    { 
     var source = "tcm:7-426-8"; 
     var target = "tcm:10-15-2"; 

     var res = pattern1.Replace(source, pattern1.Match(target).Value); 
     // "tcm:10-426-8" 
    } 

Edit: Для того, чтобы не ваша строка заменена чем-то пустой, добавить if-условие до actualy замены.

+0

Что делать, если в 'target' нет совпадения? –

+0

Затем исходное совпадение будет заменено пустой строкой. Добавлена ​​проверка перед регулярным выражением. Спасибо за подтверждение ввода подсказки не было в моей сфере. – Alex

0

Heres без регулярных выражений

string source = "tcm:7-426-8"; 
string target = "tcm:10-15-2"; 
int targetBeginning = target.IndexOf("-"); 
int sourceBeginning = source.IndexOf("-"); 
string temp = target.Substring(0, targetBeginning);//tcm:10 
string result = temp + source.Substring(sourceBeginning, source.Length-sourceBeginning); //tcm:10 + -426-8