我需要检查一个字符串是否只包含字母、数字和下划线。这是我的尝试,但它不起作用:
for(int i = 0; i<=snameA.Length-1; i++)
{
validA = validA && (char.IsLetterOrDigit(snameA[i])||snameA[i].Equals("_"));
}
我需要检查一个字符串是否只包含字母、数字和下划线。这是我的尝试,但它不起作用:
for(int i = 0; i<=snameA.Length-1; i++)
{
validA = validA && (char.IsLetterOrDigit(snameA[i])||snameA[i].Equals("_"));
}
我喜欢 Linq 因为它可以方便地回答这种问题:
bool validA = sname.All(c => Char.IsLetterOrDigit(c) || c.Equals('_'));
每次都给validA
重新赋值,而没有检查它之前的值。现在你总是获取最后执行的检查结果。
你可以使用“and”操作符来处理结果:
validA &= (char.IsLetterOrDigit(snameA[i]) || snameA[i] == '_');
这意味着您仍然运行所有字符,但如果第一个检查失败,则可能是无用的。因此,最好在失败时直接跳出:for(int i = 0; i<=snameA.Length-1; i++)
{
validA = (char.IsLetterOrDigit(snameA[i]) || snameA[i] == '_');
if (!validA)
{ break; } // <-- see here
}
或者使用 LINQ:
validA = snameA.All(c => char.IsLetterOrDigit(c) || c == '_');
Regex regex1 = new Regex(@"^[a-zA-Z0-9_]+$");
if(regex1.IsMatch(snameA))
{
}
Regex
将自身实例作为参数! - Bharadwaja-zA-Z0-9_
和 \w
是一样的。 - Thomas Ayouba-zA-Z0-9_
仅接受 英文 字母,而 \w
接受 任何 字母,例如 Переменная
(俄语中的变量)。你是完全正确的:问题中当前的实现(通过 char.IsLetterOrDigit
)对应于正则表达式中的 \w*
。 - Dmitry Bychenkostring pattern = @"^[a-zA-Z0-9\_]+$";
Regex regex = new Regex(pattern);
// Compare a string against the regular expression
return regex.IsMatch(stringToTest);
Regex rgx = new Regex(@"\w*");
rgs.IsMatch(yourString);
首先,“letter”这个词有点模糊:您是指a..z和A..Z字符,还是字母可以属于任何字母表,例如а..я和А..Я(俄语,西里尔字母)。根据您的当前实现,您想要第二个选项。
使用循环的典型解决方案是一直检查直到找到第一个反例:
Boolean validA = true; // true - no counter examples so far
// Why for? foreach is much readble here
foreach(Char ch in sname)
// "!= '_'" is more readable than "Equals"; and wants no boxing
if (!char.IsLetterOrDigit(ch) && ! (ch != '_')) {
Boolean validA = false; // counter example (i.e. non-letter/digit symbol found)
break; // <- do not forget this: there's no use to check other characters
}
然而,您可以使用Linq简化代码:
validA = sname.All(ch => Char.IsLetterOrDigit(ch) || ch == '_');
validA = Regex.IsMatch(sname, @"^\w*$");