C#String安全替换

时间:2016-12-08 09:43:49

标签: c# string replace

您有任何想法或提示如何安全地更换字符串吗?

示例:

string Example = "OK OR LOK";

现在我要替换" OK"用真和" LOK"假的。

Example = Example.Replace("OK", "true");
Example = Example.Replace("LOK", "false");

现在结果是:Example = "true or Ltrue";

结果应为:Example ="true or false";

我理解这个问题,但我不知道如何解决这个问题。

由于

4 个答案:

答案 0 :(得分:5)

你可以先替换最长的字符串,f.e。用这种方法:

 onsubmit="return checkForBlank()"

你的例子:

public static string ReplaceSafe(string str, IEnumerable<KeyValuePair<string, string>>  replaceAllOfThis)
{
    foreach (var kv in replaceAllOfThis.OrderByDescending(kv => kv.Key.Length))
    {
        str = str.Replace(kv.Key, kv.Value);
    }
    return str;
}

答案 1 :(得分:4)

Example = Example.Replace("LOK", "false").Replace("OK", "true");

答案 2 :(得分:2)

你可以寻找&#34; LOK&#34;首先,但这不会帮助解决更多普遍的问题,即不匹配&#34; POKE&#34;并制作&#34; PtrueE&#34;等等。

以下查找单词边界:

new Regex(@"\bLOK\b").Replace(
  new Regex(@"\bOK\b").Replace("OK OR LOK", "true"),
  "false")

更灵活的方法是再次寻找单词边界并确定在匹配评估器中正在进行的替换:

new Regex(@"\bLOK|OK\b").Replace("OK OR LoK", m =>
{
  switch(m.Value)
  {
    case "OK":
      return "true";
    default:
      return "false";
  }
})

这种方法最不可能遇到不同搜索键之间的进一步冲突。

答案 3 :(得分:1)

这可能是这种问题的开销,但这里是一个使用RegEx并带有负面后观的版本:

string Example = "OK OR LOK";
// Replace "OK" which is not preceded by any word character
string res = Regex.Replace(Example, @"(?<!\w)OK", "true");
string res2 = Regex.Replace(res, @"(?<!\w)LOK", "false");

Console.WriteLine(res);
Console.WriteLine(res2);

编辑:受@Jon Hanna启发。

如果OK或LOK应该有一个像OKE或LOCKS一样的尾部空格(\s)或字符串结尾($)可以解决问题:

string res = Regex.Replace(Example, @"(?<!\w)OK(?=[\s|$])", "true");
string res2 = Regex.Replace(res, @"(?<!\w)LOK(?=[\s|$])", "false");