2010-02-15 10 views
16

Leo una cadena desde la consola. ¿Cómo me aseguro de que solo contenga caracteres y dígitos en inglés?¿Cómo verifico que una cadena está en inglés?

+14

Qué son los “caracteres en inglés” para usted (por no hablar del hecho de que los guiones de idiomas son bastante diferentes cosas e Inglés utiliza el Escritura latina)? "Ingenuo" es una palabra en inglés perfectamente válida, pero contiene una carta que no es ASCII. Si su dominio es de hecho "cadena de palabras en inglés", debe ser mucho más cuidadoso que si solo quiere decir "cadenas de letras y dígitos ASCII". – Joey

+0

@Johannes Rössel ¡buen punto! –

+1

Un poco sorprendido de que nueve personas piensen que esta pregunta es "útil y clara" cuando "solo contiene caracteres y dígitos en inglés" es muy muy ambigua ... – AakashM

Respuesta

26

Suponiendo que por "caracteres en inglés" que simplemente se refieren a los 26 caracteres del alfabeto latino, esto sería un área donde me gustaría utilizar expresiones regulares: ^[a-zA-Z0-9 ]*$

Por ejemplo:

if(Regex.IsMatch(Console.ReadLine(), "^[a-zA-Z0-9]*$")) 
{ /* your code */ } 

El beneficio de las expresiones regulares en este caso es que lo único que realmente importa es si una cadena coincide con un patrón: en este caso las expresiones regulares funcionan maravillosamente. Claramente captura su intención, y es fácil de ampliar si la definición de "caracteres ingleses" se expande más allá de solo los 26 alfabéticos.

Hay un series of articles here decente que enseña más sobre las expresiones regulares.

La respuesta de Jørn Schou-Rode proporciona una gran explicación de cómo la expresión regular presentada aquí funciona para coincidir con su entrada.

+3

Es posible que también desee incluir espacios en blanco; "a b c" devuelve falso para el patrón de expresión regular dado. –

+2

... y puntuación – Joe

+2

¿Y qué hay de los caracteres de puntuación de lujo como el carácter de elipsis (...) o los apóstrofos rizados? Estos tienen sus propios caracteres Unicode. –

12

Se podría compararlo con esta expresión regular: ^[a-zA-Z0-9]*$

  • ^ coincide con el inicio de la cadena (es decir, no hay caracteres están permitidos antes de este punto)
  • [a-zA-Z0-9] partidos cualquier letra A a la Z en el inferior o superior caso, así como los dígitos 0-9
  • * permite la repetición partido anterior cero o más veces
  • $ coincide con el final del st anillo (es decir, no se permiten caracteres después de este punto)

Para utilizar la expresión en un programa en C#, se tendrá que importar System.Text.RegularExpressions y hacer algo como esto en su código:

bool match = Regex.IsMatch(input, "^[a-zA-Z0-9]*$"); 

Si se va a probar una gran cantidad de líneas contra el patrón, es posible que desee para compilar la expresión:

Regex pattern = new Regex("^[a-zA-Z0-9]*$", RegexOptions.Compiled); 

for (int i = 0; i < 1000; i++) 
{ 
    string input = Console.ReadLine(); 
    pattern.IsMatch(input); 
} 
+4

Tenga en cuenta que este patrón devolverá falso si la cadena de entrada contiene un espacio. –

1
bool AllAscii(string str) 
{ 
    return !str.Any(c => !Char.IsLetterOrDigit(c)); 
} 
+0

Bueno para determinar si una cadena tiene un carácter no válido ... – IAbstract

+13

IsLetterOrDigit será verdadero para cualquier letra Unicode. No solo para ingles ¿Estoy en lo correcto? –

+0

Tiene un resultado falso según lo que pruebo. –

0

Algo como esto (si desea controlar la entrada):

static string ReadLettersAndDigits() { 
    StringBuilder sb = new StringBuilder(); 
    ConsoleKeyInfo keyInfo; 
    while ((keyInfo = Console.ReadKey(true)).Key != ConsoleKey.Enter) { 
     char c = char.ToLower(keyInfo.KeyChar); 
     if (('a' <= c && c <= 'z') || char.IsDigit(c)) { 
      sb.Append(keyInfo.KeyChar); 
      Console.Write(c); 
     } 
    } 
    return sb.ToString(); 
} 
2

¿tiene acceso web? Supongo que no se puede garantizar, pero Google tiene una API de idioma que detectará el idioma que le pasa. google language api

0

Si yo no wnat de usar expresiones regulares, y sólo para proporcionar una solución alternativa, sólo puede comprobar el código ASCII de cada carácter y si se encuentra entre ese rango, sería o bien ser una letra Inglés o un número (Esto puede no ser la mejor solución):

foreach (char ch in str.ToCharArray()) 
{ 
    int x = (int)char; 
    if (x >= 63 and x <= 126) 
    { 
     //this is english letter, i.e.- A, B, C, a, b, c... 
    } 
    else if(x >= 48 and x <= 57) 
    { 
     //this is number 
    } 
    else 
    { 
     //this is something diffrent 
    } 

} 

http://en.wikipedia.org/wiki/ASCII para la tabla ASCII completo.

Pero sigo pensando que RegEx es la mejor solución.

+1

Esta respuesta incorrecta confunde ASCII por "inglés". – tchrist

0

Acepto las respuestas de Expresión regular. Sin embargo, podría simplificarlo simplemente a "^ [\ w] + $". \ w es cualquier "carácter de palabra" (que se traduce en [a-zA-Z_0-9] si utiliza un alfabeto que no sea unicode. No sé si también desea caracteres de subrayado.

Más sobre expresiones regulares en .net aquí:. http://msdn.microsoft.com/en-us/library/ms972966.aspx#regexnet_topic8

0
bool onlyEnglishCharacters = !EnglishText.Any(a => a > '~'); 

Parece barato, pero funcionó para mí, una respuesta fácil de fiar creo que sirve a nadie

+1

'NUL',' BEL' y otros caracteres ASCII de gama baja son todos menos que "~", lo que hace que esto sea mucho más frágil de lo necesario.Agrega un '|| a <'0' 'y estarías más cerca de una solución :-) –

0

Como muchos señalaron, respuesta aceptada sólo funciona si hay una sola palabra. en la cadena. Como no hay respuestas que cubran el caso de varias palabras o incluso oraciones en la cadena, aquí está el código:

stringToCheck.Any(x=> char.IsLetter(x) && !((int)x >= 63 && (int)x <= 126)); 
1

Otra forma es comprobar si IsLower e IsUpper no son verdaderos. Algo así como:

private bool IsAllCharEnglish(string Input) 
    { 
     foreach (var item in Input.ToCharArray()) 
     { 
      if (!char.IsLower(item) && !char.IsUpper(item) && !char.IsDigit(item) && !char.IsWhiteSpace(item)) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 

y para el uso que:

 string str = "فارسی abc"; 
     IsAllCharEnglish(str); // return false 
     str = "These are english 123"; 
     IsAllCharEnglish(str); // return true 
0
<?php 
    $string="हिन्दी"; 
    $string="Manvendra Rajpurohit"; 
    echo strlen($string); echo '<br>'; 
    echo mb_strlen($string, 'utf-8'); 
    echo '<br>'; 
    if(strlen($string) != mb_strlen($string, 'utf-8')) 
    { 
     echo "Please enter English words only:("; 
    } 
    else { 
     echo "OK, English Detected!"; 
    } 
?> 
+0

Prueba este sencillo truco y estoy seguro de que lo disfrutas ... –

Cuestiones relacionadas