如何替换所有给定的字符?

How to replace all given characters?

我正在尝试编写一种方法,使用正则表达式 将输入数组 (charsToReplace) 中出现的所有字符 替换为 replacementCharacter .我写的版本 不起作用 如果数组包含任何字符 可能会改变 正则表达式模式的含义,例如 ']''^'.

public static string ReplaceAll(string str, char[] charsToReplace, char replacementCharacter)
{
    if(str.IsNullOrEmpty())
    {
        return string.Empty;
    }

    var pattern = $"[{new string(charsToReplace)}]";
    return Regex.Replace(str, pattern, replacementCharacter.ToString());
}

所以 ReplaceAll("/]a", {'/', ']' }, 'a') 应该 return "aaa".

我建议使用 Linq,而不是 正则表达式:

using System.Linq;

...

public static string ReplaceAll(
  string str, char[] charsToReplace, char replacementCharacter) 
{
   // Please, note IsNullOrEmpty syntax
   // we should validate charsToReplace as well
   if (string.IsNullOrEmpty(str) || null == charsToReplace || charsToReplace.Length <= 0)
     return str; // let's just do nothing (say, not turn null into empty string)

   return string.Concat(str.Select(c => charsToReplace.Contains(c) 
     ? replacementCharacter
     : c));
}

如果您坚持 Regex(请注意,我们应该 Regex.Escape 个字符在 charsToReplace 内)。但是根据manualRegex.Escape不逃避-[特殊意义 在正则表达式 方括号 中。

public static string ReplaceAll(
  string str, char[] charsToReplace, char replacementCharacter) {

  if (string.IsNullOrEmpty(str) || null == charsToReplace || charsToReplace.Length <= 0)
    return str;

  string charsSet = string.Concat(charsToReplace
    .Select(c => new char[] { ']', '-' }.Contains(c) // in case of '-' and ']'
       ? $@"\{c}"                                    // escape them as well
       : Regex.Escape(c.ToString())));

  return Regex.Replace(
     str,
    $"[{charsSet}]+",
     m => new string(replacementCharacter, m.Length));
}

在字符class中,只有4个字符需要转义,^-]\你不能使用 Regex.Escape 因为它不会转义 -] 因为它们不在字符 "special" 之外 class。请注意,Regex.Escape 仅用于 outside 字符 classes.

的文字字符(序列)

未转义的 ] 字符会 过早地关闭您的角色 class ,这是您的代码无法正常工作的主要原因。

所以,固定的 pattern 变量定义可以像

var pattern = $"[{string.Concat(charsToReplace).Replace(@"\", @"\").Replace("-", @"\-").Replace("^", @"\^").Replace("]", @"\]")}]";

看到一个online C# demo