检查字符串是否仅包含字母,数字和下划线

10 .net c# regex linq

我必须检查一个字符串是否只包含字母,数字和下划线.这是我尝试的方式,但它不起作用:

for(int i = 0; i<=snameA.Length-1; i++)
{
    validA = validA && (char.IsLetterOrDigit(snameA[i])||snameA[i].Equals("_"));
}
Run Code Online (Sandbox Code Playgroud)

Tho*_*oub 11

我喜欢Linq这样的问题:

bool validA = sname.All(c => Char.IsLetterOrDigit(c) || c.Equals('_'));
Run Code Online (Sandbox Code Playgroud)


Pat*_*man 10

validA每次都要分配,而不检查其先前的值.现在,您始终可以获得上次执行检查的值.

你可以'和'结果:

validA &= (char.IsLetterOrDigit(snameA[i]) || snameA[i] == '_');
Run Code Online (Sandbox Code Playgroud)

这意味着您仍然可以运行所有字符,如果第一次检查失败,这可能毫无用处.如果它失败,最好简单地走出去:

for(int i = 0; i<=snameA.Length-1; i++)
{
    validA = (char.IsLetterOrDigit(snameA[i]) || snameA[i] == '_');

    if (!validA)
    { break; } // <-- see here
}
Run Code Online (Sandbox Code Playgroud)

或者使用LINQ:

validA = snameA.All(c => char.IsLetterOrDigit(c) || c == '_');
Run Code Online (Sandbox Code Playgroud)


Sac*_*chu 5

你可以使用正则表达式

Regex regex1 = new Regex(@"^[a-zA-Z0-9_]+$");

if(regex1.IsMatch(snameA))
{

}
Run Code Online (Sandbox Code Playgroud)

  • @Thomas:不,有一个细微的区别:`a-zA-Z0-9_` 只接受 *English* 字母表,当 `\w` 接受 *任何* 字母时,例如 `Переменная`(俄语变量)。你说得对:问题中的当前实施(通过`char.IsLetterOrDigit`)对应于正则表达式中的`\w*` (3认同)