如何替换所有给定的字符?
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。
我正在尝试编写一种方法,使用正则表达式 将输入数组 (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。