4

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

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。

怎么做?

4

7 回答 7

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
于 2013-01-11T06:43:22.340 回答
1

最简单的方法是使用正则表达式:

val3 = Regex.Replace(Regex.Replace(str, @"\bIS_PARENT\b", Val1), @"\bIS_CHILD\b", Val2);
于 2013-01-11T06:50:35.820 回答
1

一个非常简单的方法是:

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

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

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

str 来自哪里?

于 2013-01-11T07:00:59.333 回答
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;
}

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

于 2013-01-11T06:45:41.067 回答
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
于 2013-01-11T06:49:41.780 回答
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();
于 2013-01-11T06:50:51.097 回答
0

像这样使用 Body.Replace("\bat\b", "at")

于 2013-11-12T12:13:41.950 回答