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 は 2 つの場所にあるため、両方の IS_CHILD を置き換えます。

正確な単語 IS_CHILD のみを置き換えたい。

どうやってするか?

4

7 に答える 7

1

Regex.Replaceを使用できます

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

EDIT:IS_PARENTをIS_CHILDと同じ基準で置き換えたい場合(単語全体のみを置き換えます)

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

または (これは最適化されておらず、単一の単語を置き換える1つの方法であるため、回答に含まれています)

スペースに基づいて文字列を分割し、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 に答える