我有一个字符串,我想确保它只包含BSEO|0123456789
中的字符。我试着用这个正则表达式做到这一点
Regex r = new Regex("^[BSEO|0123456789]");
if (r.IsMatch(str)) throw new Exception("Invalid character.");
但它的行为不正确,(例如字符串SE
抛出异常)。我做错了什么,如何修复它,是否有比使用正则表达式更好的解决方案?
答案 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.");
^
匹配字符串的开头。 +
表示[]
中的任何字符都应至少出现一次。 $
匹配字符串的结尾。所以它说:
字符串的开头后面应该跟一个包含[]
内部的一个或多个字符的序列,后面跟着字符串的结尾。