C# 如何从字符串中删除字符(列表中的字符除外)

C# 如何从字符串中删除字符(列表中的字符除外),c#,regex,list,replace,character,C#,Regex,List,Replace,Character,这是我的字符串值: string str = "32 ab d32"; 此列表是我允许的字符: var allowedCharacters = new List<string> { "a", "b", "c", "2", " " }; 我想用一个空格替换不在允许字符列表中的任何字符。不带正则表达式: IEnumerable<Char> allowed = srVariable .Select(c => lstAllowedCharacters.Conta

这是我的字符串值:

string str = "32 ab d32";
此列表是我允许的字符:

var allowedCharacters = new List<string> { "a", "b", "c", "2", " " };
我想用一个空格替换不在允许字符列表中的任何字符。

不带正则表达式:

IEnumerable<Char> allowed = srVariable
    .Select(c => lstAllowedCharacters.Contains(c.ToString()) ? c : ' ');
string result = new string(allowed.ToArray());
IEnumerable allowed=srVariable
.Select(c=>lstalowedcharacters.Contains(c.ToString())?c:“”);
字符串结果=新字符串(allowed.ToArray());
不带正则表达式:

IEnumerable<Char> allowed = srVariable
    .Select(c => lstAllowedCharacters.Contains(c.ToString()) ? c : ' ');
string result = new string(allowed.ToArray());
IEnumerable allowed=srVariable
.Select(c=>lstalowedcharacters.Contains(c.ToString())?c:“”);
字符串结果=新字符串(allowed.ToArray());
为什么不使用?

为什么不使用?

试试这个:

string srVariable = "32 ab d32";
List<string> lstAllowedCharacters = new List<string> { "a", "b", "c", "2", " " };

srVariable = Regex.Replace(srVariable, "[^" + Regex.Escape(string.Join("", lstAllowedCharacters) + "]"), delegate(Match m)
{
    if (!m.Success) { return m.Value; }
    return " ";
});

Console.WriteLine(srVariable);
string srVariable=“32 ab d32”;
List lstalowedcharacters=新列表{“a”、“b”、“c”、“2”、“2”);
srVariable=Regex.Replace(srVariable,[^“+Regex.Escape(string.Join(“,lstalowedcharacters)+“]),委托(匹配m)
{
如果(!m.Success){返回m.Value;}
返回“”;
});
Console.WriteLine(srVariable);
试试这个:

string srVariable = "32 ab d32";
List<string> lstAllowedCharacters = new List<string> { "a", "b", "c", "2", " " };

srVariable = Regex.Replace(srVariable, "[^" + Regex.Escape(string.Join("", lstAllowedCharacters) + "]"), delegate(Match m)
{
    if (!m.Success) { return m.Value; }
    return " ";
});

Console.WriteLine(srVariable);
string srVariable=“32 ab d32”;
List lstalowedcharacters=新列表{“a”、“b”、“c”、“2”、“2”);
srVariable=Regex.Replace(srVariable,[^“+Regex.Escape(string.Join(“,lstalowedcharacters)+“]),委托(匹配m)
{
如果(!m.Success){返回m.Value;}
返回“”;
});
Console.WriteLine(srVariable);

正则表达式?Regex对于你想要完成的事情来说可能有些过分了

这里是没有正则表达式的另一个变体(将您的
lstalowedcharacters
修改为可枚举的字符,而不是字符串[正如变量名所暗示的那样]:

String original=“32 ab d32”;
Char replacementChar='';
IEnumerable allowedChars=new[]{'a','b','c','2','';
字符串结果=新字符串(
original.Select(x=>!allowedChars.Contains(x)?replacementChar:x.ToArray()
);

正则表达式?Regex对于你想要完成的事情来说可能有些过分了

这里是没有正则表达式的另一个变体(将您的
lstalowedcharacters
修改为可枚举的字符,而不是字符串[正如变量名所暗示的那样]:

String original=“32 ab d32”;
Char replacementChar='';
IEnumerable allowedChars=new[]{'a','b','c','2','';
字符串结果=新字符串(
original.Select(x=>!allowedChars.Contains(x)?replacementChar:x.ToArray()
);

以下是每个解决方案的一个简单但高效的解决方案:

Hashset<char> lstAllowedCharacters = new Hashset<char>{'a','b','c','2',' '};

var resultStrBuilder = new StringBuilder(srVariable.Length);

foreach (char c in srVariable) 
{
    if (lstAllowedCharacters.Contains(c))
    {
        resultStrBuilder.Append(c);
    }
    else
    {
        resultStrBuilder.Append(" ");
    }
}

srVariable = resultStrBuilder.ToString();
Hashset lstalowedcharacters=新的Hashset{'a','b','c','2','''};
var resultStrBuilder=新的StringBuilder(srVariable.Length);
foreach(srVariable中的字符c)
{
if(lstalowedcharacters.Contains(c))
{
结果trbuilder.Append(c);
}
其他的
{
resultStrBuilder.Append(“”);
}
}
srVariable=resultStrBuilder.ToString();

以下是每个解决方案的一个简单但高效的解决方案:

Hashset<char> lstAllowedCharacters = new Hashset<char>{'a','b','c','2',' '};

var resultStrBuilder = new StringBuilder(srVariable.Length);

foreach (char c in srVariable) 
{
    if (lstAllowedCharacters.Contains(c))
    {
        resultStrBuilder.Append(c);
    }
    else
    {
        resultStrBuilder.Append(" ");
    }
}

srVariable = resultStrBuilder.ToString();
Hashset lstalowedcharacters=新的Hashset{'a','b','c','2','''};
var resultStrBuilder=新的StringBuilder(srVariable.Length);
foreach(srVariable中的字符c)
{
if(lstalowedcharacters.Contains(c))
{
结果trbuilder.Append(c);
}
其他的
{
resultStrBuilder.Append(“”);
}
}
srVariable=resultStrBuilder.ToString();

@des谢谢我忘了编码:D@des谢谢,我忘记了编码:Dnope我希望它替换预定义列表中没有的字符,而不是像您显示的那样定义它们。我已经调整了我的答案,但是请注意模式中的否定字符
^
。结果确实返回您要求的
“2 ab 2”
。可能需要在插入
正则表达式之前调用。请替换
调用以避免任何无效字符。结果是:
Regex.Replace(srVariable,String.Format(“[^{0}]”,Regex.Escape(String.Join(String.Empty,lstalowedcharacters)))
nope我希望它替换预定义列表中没有的字符,而不是像您显示的那样定义它们。我已经调整了答案,但是请注意模式中的否定字符
^
。结果确实返回您要求的
“2 ab 2”
。可能需要在插入
正则表达式之前调用。请替换
调用以避免任何无效字符。结果是:
Regex.Replace(srVariable,String.Format(“[^{0}]”),Regex.Escape(String.Join(String.Empty,lstalowedcharacters)))
@MonsterMMORPG:取决于实现。字符串列表可能会失败(因为即使字符串被接受,Tim实际上只是在逐个字符进行比较)。它们都做相同的事情,我只是让它更明确地比较什么。@MonsterMMORPG:取决于实现。字符串列表可能会失败(因为即使字符串被接受,Tim实际上只是在逐个字符进行比较)。它们都是一样的,我只是让它更清楚地说明所比较的是什么。