如何使用2替换替换完全匹配的字符串

时间:2013-01-11 06:40:09

标签: c#

我正在尝试替换字符串,但由于匹配单词很少,它正在替换字符串。

Val1 = "CASE WHEN [" + isParent + "] = 0 THEN 'False' WHEN [" + isParent + "] = 1 THEN 'True' END ";
Val2 = "CASE WHEN [" + isChild + "] = 0 THEN 'False' WHEN [" + isChild  + "] = 1 THEN 'True' END ";
val3 = str.Replace("IS_PARENT", Val1 ).Replace("IS_CHILD", val2);

在我的

str = "IS_PARENT, IS_CHILD_WITH_ROLE, IS_CHILD"; 

IS_CHILD来自两个地方,所以它正在取代两个IS_CHILD。

我想只替换确切的单词IS_CHILD。

怎么做?

7 个答案:

答案 0 :(得分:1)

您可以使用Regex.Replace

string newString = Regex.Replace(str, @"\bIS_CHILD\b", replacedText);

编辑: 如果要使用与IS_CHILD 相同的条件替换IS_PARENT(仅替换整个单词)

string  newString = Regex.Replace(newString, @"\bIS_PARENT\b", "NEW TEXT");
newString = Regex.Replace(str, @"\bIS_CHILD\b", replacedText);

(这不是优化的,在答案中是因为它是替换单个单词的一种方式)

您可以根据空格拆分字符串,然后在替换完整单词后使用string.Join创建新字符串。

string str = "IS_PARENT, IS_CHILD_WITH_ROLE, IS_CHILD";
string replacedText = "SomeThing";
string newString = string.Join(" ", str.Split()
                                       .Select(r => r == "IS_CHILD" ? replacedText : r));

新字符串将是:

IS_PARENT, IS_CHILD_WITH_ROLE, SomeThing

答案 1 :(得分:1)

最简单的方法是使用Regex:

val3 = Regex.Replace(Regex.Replace(str, @"\bIS_PARENT\b", Val1), @"\bIS_CHILD\b", Val2);

答案 2 :(得分:1)

一种非常简单的方法是:

val3 = str.Replace("IS_PARENT", Val1 ).Replace(", IS_CHILD", ", "+val2);

但在那种情况下,为什么你不会这样做:

val3 = val1 + ", IS_CHILD_WITH_ROLE, " + val2;

str来自哪里?

答案 3 :(得分:0)

使用LastIndexOf,手动剪切字符串并将替换插入正确的位置。像这样:

Val1 = "CASE WHEN [" + isParent + "] = 0 THEN 'False' WHEN [" + isParent + "] = 1 THEN 'True' END ";
Val2 = "CASE WHEN [" + isChild + "] = 0 THEN 'False' WHEN [" + isChild  + "] = 1 THEN 'True' END ";
ReplaceLast(str, "IS_PARENT", Val1 );
ReplaceLast(str, "IS_CHILD", Val2 );

public static string ReplaceLast(this string value, 
                                      string oldWord, string newWord)
{
    int index = value.LastIndexOf(oldWord);
    String modified = value.Remove(index, oldWord.Length);
    modified = modified.Insert(index, newWord);
    return modified;
}

在这种情况下,这可能是处理能力和内存消耗最少的方法。它也是最低级别的。

答案 4 :(得分:0)

您可以尝试在扩展方法中使用正则表达式来保留相同的语法样式:

public static class Extensions
{
    public static string ReplaceExact(this string value, 
                                      string oldWord, string newWord)
    {
        Regex r = new Regex(string.Format(@"\b{0}\b", oldWord));
        return r.Replace(value, newWord);
    }
}

并使用它:

string str = "IS_CHILD, IS_CHILD ,IS_CHILD, IS_PARENT, IS_CHILD_WITH_ROLE, IS_CHILD";
string result = str.ReplaceExact("IS_CHILD", "000")
                   .ReplaceExact("IS_PARENT", "111");
Console.WriteLine(result); 
//prints: 000, 000 ,000, 111, IS_CHILD_WITH_ROLE, 000

答案 5 :(得分:0)

可能会有所帮助

string child = "IS_PARENT, IS_CHILD_WITH_ROLE, IS_CHILD", 
       resultString = string.Empty;

List<string> chunks = child.Split(' ').ToList();
chunks.ForEach(delegate(string i)
{
   if (string.Equals(i, "IS_CHILD", StringComparison.CurrentCultureIgnoreCase))
      resultString += "ReplaceString ";
   else
      resultString += i + " ";
});

Console.WriteLine(child);
Console.WriteLine(resultString);

Console.Read();

答案 6 :(得分:0)

像这样使用Body.Replace(&#34; \ bat \ b&#34;,&#34; at&#34;)