确保字符串只包含c#中的某些字符
本文关键字:字符 字符串 包含 确保 | 更新日期: 2023-09-27 18:18:50
我有一个字符串,我想确保它只包含BSEO|0123456789
中的字符。我试着用这个regex
Regex r = new Regex("^[BSEO|0123456789]");
if (r.IsMatch(str)) throw new Exception("Invalid character.");
但它的行为不正确,(例如字符串SE
抛出异常)。我做错了什么,我该如何修复它,还有比使用正则表达式更好的解决方案吗?
你可以使用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.");
现在您正在匹配一个字符串,该字符串可以以其中一个字符开头,但可以在其后包含任何其他字符。当你有匹配的时候你也会抛出异常我猜这和你想做的是相反的。试试这个:
Regex r = new Regex("^[BSEO|0123456789]+$");
if (!r.IsMatch(str)) throw new Exception("Invalid character.");
^
匹配字符串的开头。+
表示[]
中的任何字符应该至少出现一次。$
匹配字符串的末尾。所以它说:字符串的开头后跟一个序列,该序列包含[]
中的一个或多个字符,然后后跟字符串的结尾。