2009-07-25 22 views
146

tengo una cadena de entrada y quiero comprobar que contiene:Verificación de que una cadena contiene sólo letras en C#

  • Sólo letras o
  • Sólo letras y números o
  • sólo letras, números o subrayado

Para aclarar, tengo 3 casos diferentes en el código, cada uno pidiendo una validación diferente. ¿Cuál es la forma más sencilla de lograr esto en C#?

Respuesta

223

Sólo letras:

Regex.IsMatch(input, @"^[a-zA-Z]+$"); 

sólo letras y números:

Regex.IsMatch(input, @"^[a-zA-Z0-9]+$"); 

sólo letras, números y subrayan:

Regex.IsMatch(input, @"^[a-zA-Z0-9_]+$"); 
+24

Esto supone un alfabeto latino, donde Char.IsLetter permite alfabetos no latinos. –

+5

Regex.IsMatch (entrada, "^ [a-z0-9] + $", RegexOptions.IgnoreCase); –

+3

@TomFobear: esto es más lento que especificar explícitamente [a-zA-Z] –

3

Puede recorrer en los caracteres de la cadena y comprobar mediante el Método Char IsLetter pero se puede también hacer un truco con el método de cadena IndexOfAny para buscar otros charaters que no se supone que debe ser en la cadena.

1

Iterar a través de personajes cuerdas y utilizar las funciones de 'Char 'llamado' IsLetter 'y' IsDigit '.

Si necesita algo más específico, use la clase Regex.

7

Creo que es un buen caso de utilizar expresiones regulares:

public bool IsAlpha(string input) 
{ 
    return Regex.IsMatch(input, "^[a-zA-Z]+$"); 
} 

public bool IsAlphaNumeric(string input) 
{ 
    return Regex.IsMatch(input, "^[a-zA-Z0-9]+$"); 
} 

public bool IsAlphaNumericWithUnderscore(string input) 
{ 
    return Regex.IsMatch(input, "^[a-zA-Z0-9_]+$"); 
} 
+2

Regex tiene métodos estáticos para esto –

+0

Agradable, no lo recordé, no tengo VS a mano ... editando ... – CMS

42

Cartas solamente:

Regex.IsMatch(theString, @"^[\p{L}]+$"); 

letras y los números:

Regex.IsMatch(theString, @"^[\p{L}\p{N}]+$"); 

letras, números y guión:

Regex.IsMatch(theString, @"^[\w]+$"); 

Tenga en cuenta que estos patrones también coinciden con los caracteres internacionales (en lugar de utilizar el constructo a-z).

191
bool result = input.All(Char.IsLetter); 

bool result = input.All(Char.IsLetterOrDigit); 

bool result = input.All(c=>Char.IsLetterOrDigit(c) || c=='_'); 
+3

Me gustaría saber cuál es más rápido el suyo (LINQ) ¿o el de Philippe Leybaert (Regex)? – nam

17

Para aquellos de ustedes que prefieren no ir con Regex y están en .NET 2.0 Marco (También conocido como sin LINQ):

sólo letras:

public static bool IsAllLetters(string s) 
{ 
    foreach (char c in s) 
    { 
     if (!Char.IsLetter(c)) 
      return false; 
    } 
    return true; 
} 

sólo números:

public static bool IsAllDigits(string s) 
    { 
     foreach (char c in s) 
     { 
      if (!Char.IsDigit(c)) 
       return false; 
     } 
     return true; 
    } 

sólo números o letras:

public static bool IsAllLettersOrDigits(string s) 
    { 
     foreach (char c in s) 
     { 
      if (!Char.IsLetterOrDigit(c)) 
       return false; 
     } 
     return true; 
    } 

Solamente los números o las letras o caracteres de subrayado:

public static bool IsAllLettersOrDigitsOrUnderscores(string s) 
    { 
     foreach (char c in s) 
     { 
      if (!Char.IsLetterOrDigit(c) && c != '_') 
       return false; 
     } 
     return true; 
    } 
1

Si usted es un novato, entonces puede tomar de referencia desde mi código .. lo que hice fue poner en un cheque de modo que sólo podía conseguir los alfabetos y espacios blancos! Se puede repetir el bucle después de la segunda sentencia if para validar la cadena de nuevo

 bool check = false; 

     Console.WriteLine("Please Enter the Name"); 
     name=Console.ReadLine(); 

     for (int i = 0; i < name.Length; i++) 
     { 
      if (name[i]>='a' && name[i]<='z' || name[i]==' ') 
      { 
       check = true; 
      } 
      else 
      { 
       check = false; 
      } 

     } 

     if (check==false) 
     { 
      Console.WriteLine("Enter Valid Value"); 
      name = Console.ReadLine(); 
     } 
Cuestiones relacionadas