根据带字符串的位置替换c#中字符串中的字符

时间:2012-04-02 09:04:35

标签: c# c#-4.0 c#-3.0

我想用c#中的字符串替换字符串中的charecter。 我试过以下,

在下面的程序中,我希望在charecters':'之间替换charer的集合:'和' - '的第一次出现以及其他一些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"

简而言之,我想用':'和' - '(firstoccurance)和charecters extracetd替换同一种字符串之间的charectes。

可以提供任何帮助。

谢谢。

4 个答案:

答案 0 :(得分:3)

如果要使用目标内容替换源中的第一个“: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子句。

答案 1 :(得分:0)

我不清楚用于决定使用哪个字符串的逻辑,但仍然应该使用Split(),而不是使用字符串偏移: (注意删除(0,4)是为了删除tcm:前缀)

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

现在,您可以在易于访问的数组中使用sourcetarget中的数字,因此您可以按照自己的方式构建新字符串:

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

答案 2 :(得分:0)

尝试正则表达式解决方案 - 首先使用此方法,获取sourcetarget字符串,并在第一个字符串上执行正则表达式替换,目标是'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"));
}

答案 3 :(得分: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