我想从字符串中删除一组字符:"/\[]:|<>+=;,?*'@
我正在尝试:
private const string CHARS_TO_REPLACE = @"""/\[]:|<>+=;,?*'@";
private string Clean(string stringToClean)
{
return Regex.Replace(stringToClean, "[" + Regex.Escape(CHARS_TO_REPLACE) + "]", "");
}
但是,结果与输入完全相同,如"Foo, bar and other"
。
我的代码有什么问题?
this question看起来很多,但是使用黑名单而不是白名单列表,所以我删除了^
字符中的not。
答案 0 :(得分:5)
您没有逃离CHARS_TO_REPLACE
答案 1 :(得分:3)
如上所述(但答案突然消失),Regex.Escape
无法逃脱]
,因此您需要调整代码:
return Regex.Replace(stringToClean, "[" + Regex.Escape(CHARS_TO_REPLACE)
.Replace("]", @"\]") + "]", " ");
答案 2 :(得分:3)
问题是对Regex.Escape
如何运作的误解。来自MSDN:
通过将其替换为转义码来转义一组最小字符(\,*,+,?,|,{,[,(,),^,$ ,.,#和空格)。
它按预期工作,但您需要将Regex.Escape
视为转义字符类之外的元字符。当您使用字符类时,您想要转义内部的内容是不同的。例如,字符类-
内部应该转义为文字,否则它可以作为一系列字符(例如[A-Z]
)。
在您的情况下,正如其他人所提到的,]
未被转义。对于在字符类中具有特殊含义的任何字符,您需要在调用Regex.Escape
后单独处理它们。这应该做你需要的:
string CHARS_TO_REPLACE = @"""/\[]:|<>+=;,?*'@";
string pattern = "[" + Regex.Escape(CHARS_TO_REPLACE).Replace("]", @"\]") + "]";
string input = "hi\" there\\ [i love regex];@";
string result = Regex.Replace(input, pattern, "");
Console.WriteLine(result);
否则,您最终得到的["/\\\[]:\|<>\+=;,\?\*'@]
没有]
转义,所以它真的是["/\\\[]
作为一个字符类,然后:\|<>\+=;,\?\*'@]
作为模式的其余部分,除非你的字符串与那些剩余的字符完全匹配,否则它们将不匹配。
答案 3 :(得分:1)
CHARS_TO_REPLACE
中有许多字符是Regex的特殊字符,需要使用斜杠\
进行转义。
这应该有效:
"/\[]:\|<>\+=;,\?\*'@
答案 4 :(得分:1)
为什么不这样做:
private static string Clean(string stringToClean)
{
string[] disallowedChars = new string[] {//YOUR CHARS HERE};
for (int i = 0; i < disallowedChars.Length; i++)
{
stringToClean= stringToClean.Replace(disallowedChars[i],"");
}
return stringToClean;
}
答案 5 :(得分:1)
单语句linq解决方案:
private const string CHARS_TO_REPLACE = @"""/\[]:|<>+=;,?*'@";
private string Clean(string stringToClean) {
return CHARS_TO_REPLACE
.Aggregate(stringToClean, (str, l) => str.Replace(""+l, ""));
}
答案 6 :(得分:0)
为了便于了解,这里有一个适用于非常大的字符串(甚至是流)的变体。这里没有正则表达式,只需在每个字符上循环一个字符串构建器来存储结果:
class Program
{
private const string CHARS_TO_REPLACE = @"""/\[]:|<>+=;,?*'@";
static void Main(string[] args)
{
var wc = new WebClient();
var veryLargeString = wc.DownloadString("http://msdn.microsoft.com");
using (var sr = new StringReader(veryLargeString))
{
var sb = new StringBuilder();
int readVal;
while ((readVal = sr.Read()) != -1)
{
var c = (char)readVal;
if (!CHARS_TO_REPLACE.Contains(c))
{
sb.Append(c);
}
}
Console.WriteLine(sb.ToString());
}
}
}