2011-04-08 34 views
10

Necesito escribir una expresión regular para la validación de formularios que permita espacios dentro de una cadena, pero no solo permite espacios en blanco.Expresión regular que permite espacios en una cadena, pero no solo espacios en blanco

Por ejemplo, 'Chicago Heights, IL' sería válido, pero si un usuario simplemente pulsa la barra espaciadora varias veces y pulsa enter el formulario no se validaría. Antes de la validación, intenté ejecutar un if (foo != null) y luego ejecutar la expresión regular, pero presionar la barra espaciadora aún registra caracteres, por lo que no estaba funcionando. Esto es lo que estoy usando en este momento, que permite que los espacios:

^[-a-zA-Z0-9_:,.' ']{1,100}$ 
+0

¿Qué idioma? Java/C#? – kennytm

Respuesta

15

No estoy seguro de que necesite un RegEx aquí. ¿Por qué no simplemente llamar al método Trim() de su idioma y luego asegurarse de que la cadena resultante no esté vacía?

+0

¿Esto no recortará ningún espacio en blanco ... Todavía tengo que dejar espacio en blanco entre las palabras, por ej. Chicago, IL (necesita el espacio entre la coma y la capital I). – user699242

+0

Depende del idioma, por supuesto, pero la mayoría de los métodos Trim() solo eliminan el espacio en blanco en cualquier extremo de la cadena. Además, no tiene que * usar * la cadena recortada si no lo desea. Es solo que Trim() - una cadena que es todo espacio en blanco devolverá la cadena vacía, que es fácil de verificar. – dlev

+0

¡Oh, genial! Voy a intentar esto. Gracias. Esto es simplemente JavaScript, por cierto. – user699242

26

Es muy simple: .*\S.*

Esto requiere un carácter no-espacio, en cualquier lugar. La sintaxis de expresión regular es para expresiones regulares compatibles con Perl 5, si tiene otro idioma, la sintaxis puede diferir un poco.

+0

Acabo de darme cuenta de eso. Haber borrado, y ofrecer mis disculpas. – dlev

+0

Esto no aborda el máximo de 100 caracteres, sin embargo. Tu '. *' También es más amplio que su clase de personaje. –

+0

No leí el 100 como requisito, solo como lo que el cartel original probó hasta ahora. El límite se puede expresar como una expresión regular, pero como las expresiones regulares no pueden contar caracteres, sería una molestia escribir. Es mucho más simple ignorar por completo las expresiones regulares en este caso y escribir 's = s.trim(); if (s.length()> = 1 && s.length() <= 100) {...} ' –

-1

probar este expresión regular:

^[^\s]+(\s.*)?$ 

Se significa uno o más caracteres que no son del espacio, entonces, opcionalmente, un espacio seguido por nada.

+0

Esta expresión no permite espacios. – dlev

+0

Eso permitiría solo espacios que no sean espacios. –

+0

Tienes razón ... Lo cambiaré –

5

Usted podría utilizar simple:

^(?=.*\S).+$ 

si su motor de expresiones regulares es compatible con los símbolos de anticipación positivos. Esta expresión requiere al menos un carácter no espacial.

Véalo en rubular.

5

El siguiente será responder a su pregunta como está escrito, pero ver a mi nota adicional después:

^(?!\s*$)[-a-zA-Z0-9_:,.' ']{1,100}$ 

Explicación: El(?!\s*$) es una negative lookahead. Significa: "Los siguientes caracteres no pueden coincidir con el subpatrón \s*$". Cuando se tiene en cuenta el subpatrón, significa: "Los siguientes caracteres no pueden ser ni una cadena vacía ni una cadena de espacios en blanco hasta el final. Por lo tanto, debe haber al menos un carácter que no sea de espacio en blanco después de este punto en la cuerda." Una vez que tenga esa regla fuera del camino, puede dejar espacios en su clase de personaje.

Nota adicional: No creo que su ' ' haga lo que usted desea. Parece que intentabas representar un personaje de espacio, pero regex interpreta ' como un apóstrofo literal. Dentro de una clase de caracteres, ' ' significaría "hacer coincidir cualquier carácter que sea ', un carácter de espacio, o '" (observe que el segundo carácter ' es redundante). Sospecho que lo que quiere es la misma:

^(?!\s*$)[-a-zA-Z0-9_:,.\s]{1,100}$ 
+0

Esto parece ser lo que estaba buscando, pero por alguna razón el espacio en blanco sigue pasando la expresión regular en mi script. ¿Alguna idea de por qué podría ser? – user699242

+0

@ user699242 - Hmm. Parece que funciona correctamente aquí: http://rubular.com/r/V8nlkU7E5R y con algunas letras incluidas: http://rubular.com/r/8qjj4Z2PWs. ¿Qué idioma de expresión regular estás usando? –

+1

Esta es la respuesta más correcta, creo. La búsqueda negativa hace exactamente lo que se requería. –

-1

sólo tiene que utilizar \s* para evitar uno o más espacios en blanco en la expresión regular entre dos palabras.

Por ejemplo, "Mozilla/ 4.75" y "Mozilla/4.75" ambos pueden ser igualados por la siguiente expresión regular:

[A-Z][a-z]*/\s*[0-9]\.[0-9]{1,2} 

Adición de \s* partidos en cero, uno o más espacios en blanco entre dos palabras.

0

Si quisiéramos aplicar validaciones únicamente con carácter permitido establecer a continuación, he intentado con USERNAME_REGEX = /^(?:\s*[.\-_]*[a-zA-Z0-9]{1,}[.\-_]*\s*)$/;

  • Una cadena puede contener cualquier número de espacios al principio o final o en el medio, pero contendrá al menos un carácter alfanumérico .
  • Los caracteres opcionales ., _ , - también están permitidos, pero la cadena debe tener un carácter alfanumérico.
Cuestiones relacionadas