2012-01-20 15 views
7

Necesito una expresión regular (compatible con JavaScript) que coincida con cualquier cadena excepto una cadena que contenga solo espacios en blanco. Casos:Regex que coincida con cualquier cosa excepto en todos los espacios en blanco

" "   (one space) => doesn't match 
" "  (multiple adjacent spaces) => doesn't match 
"foo"  (no whitespace) => matches 
"foo bar" (whitespace between non-whitespace) => matches 
"foo "  (trailing whitespace) => matches 
" foo"  (leading whitespace) => matches 
" foo " (leading and trailing whitespace) => matches 
+4

Por curiosidad, ¿trató de la búsqueda de esta primera? –

+0

Sí, lo hice, me olvidé por completo de la versión negada de \ s aunque .. doh! ¡Gracias a todos los que respondieron! –

+0

En lugar de usar regex, también puede probar 'if (str.trim()) {// matches}' – Shmiddty

Respuesta

14

Esto busca al menos un carácter que no sea en blanco.

/\S/.test(" ");  // false 
/\S/.test(" ");  // false 
/\S/.test("");   // false 


/\S/.test("foo");  // true 
/\S/.test("foo bar"); // true 
/\S/.test("foo "); // true 
/\S/.test(" foo"); // true 
/\S/.test(" foo "); // true 

Creo que estoy asumiendo que una cadena vacía se debe tener en cuenta los espacios en blanco solamente.

Si una cadena vacía (que técnicamente no contiene todos los espacios en blanco, ya que no contiene nada) debe pasar la prueba, a continuación, cambiar a ...

/\S|^$/.test("  ");      // false 

/\S|^$/.test("");  // true 
/\S|^$/.test(" foo "); // true 
1
/^\s*\S+(\s?\S)*\s*$/ 

demo:

var regex = /^\s*\S+(\s?\S)*\s*$/; 
var cases = [" "," ","foo","foo bar","foo "," foo"," foo "]; 
for(var i=0,l=cases.length;i<l;i++) 
    { 
     if(regex.test(cases[i])) 
      console.log(cases[i]+' matches'); 
     else 
      console.log(cases[i]+' doesn\'t match'); 

    } 

demostración de trabajo: http://jsfiddle.net/PNtfH/1/

1

Pruebe esta expresión:

/\S+/ 

\ S significa cualquier carácter no está en blanco.

+2

No es necesario el '+'. – Phrogz

0
if (myStr.replace(/\s+/g,'').length){ 
    // has content 
} 

if (/\S/.test(myStr)){ 
    // has content 
} 
0

[¿No soy yo soy] 's respuesta es la mejor:

/\S/.test("foo"); 

alternativa que puede hacer:

/[^\s]/.test("foo"); 
Cuestiones relacionadas