确保字符串只包含C#中的某些字符

时间:2011-12-28 00:38:50

标签: c# regex

我有一个字符串,我想确保它只包含BSEO|0123456789中的字符。我试着用这个正则表达式做到这一点

Regex r = new Regex("^[BSEO|0123456789]");
if (r.IsMatch(str)) throw new Exception("Invalid character.");

但它的行为不正确,(例如字符串SE抛出异常)。我做错了什么,如何修复它,是否有比使用正则表达式更好的解决方案?

2 个答案:

答案 0 :(得分:5)

您可以使用linq:

if (str.Distinct().Except("BSEO|0123456789").Any())
    throw new Exception("Invalid character."); 

修改

在思考了一段时间之后,我认为对Distinct()的调用可能是对微优化的失败尝试。如果表现很重要,请尝试使用和不使用。没有它可能会表现得更好。

编辑2

我现在确信Distinct()使查询运行得更慢。请改用:

if (str.Except("BSEO|0123456789").Any())
    throw new Exception("Invalid character."); 

答案 1 :(得分:4)

现在您正在匹配一个字符串,该字符串可以从其中一个字符开始,但之后可以包含任何其他字符。当你确实有匹配时我也会抛出一个异常,我想这与你想做的相反。试试这个:

Regex r = new Regex("^[BSEO|0123456789]+$");
if (!r.IsMatch(str)) throw new Exception("Invalid character.");

^匹配字符串的开头。 +表示[]中的任何字符都应至少出现一次。 $匹配字符串的结尾。所以它说: 字符串的开头后面应该跟一个包含[]内部的一个或多个字符的序列,后面跟着字符串的结尾。