заменить символ в строке в C # в зависимости от позиции со строкой - PullRequest
2 голосов
/ 02 апреля 2012

Я хочу заменить символ в строке на строку в c #.Я попробовал следующее,

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

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

Кто-нибудь может сказать, как вставить их обратно в исходную строку.

        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"

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

Может помочь, как это можно сделать.

Спасибо.

Ответы [ 4 ]

3 голосов
/ 02 апреля 2012

Если вы хотите заменить первое «: 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"
    }

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

0 голосов
/ 02 апреля 2012

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
0 голосов
/ 02 апреля 2012

Попробуйте решение для регулярных выражений - сначала этот метод берет строки source и target и выполняет замену регулярных выражений для первых, нацеливая первые числа после 'tcm', которые должны быть привязаны к началустрока.В 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 голосов
/ 02 апреля 2012

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

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]);
...