2011-07-29 38 views
7

¿Puedo usar una javascript regex para contar el número de caracteres en blanco antes del primer carácter de texto en la cadena? Solo me importa si hay 0, 1 y 2+.javascript regex para contar caracteres en blanco

Mi solución de trabajo actual es tener tres expresiones regulares y simplemente usar la coincidencia para determinar la categoría de 0,1 o 2+ (patrón separado para cada una), pero estoy buscando una solución más elegante.

¿Es posible contar patrones con expresiones regulares? Podría utilizar una agrupación no expansivo y contar la longitud supongo ....

+0

¿2+ significa dos o más? ¿Es su intención producir un conteo para cada tipo de cuerda? –

Respuesta

6
"  a".match(/^\s{0,2}/)[0].length 

Esta expresión coincide con entre 0 y 2 espacios en blanco al principio de una cadena.

+1

¿Por qué no 'theString.match (/^\ s + /) [0] .length' - el OP significa, creo que 2+ significa dos o más, aunque estaba redactado de forma extraña. –

+0

@Ray: Parece que solo hay tres categorías. – SLaks

+0

correcto, solo tres categorías: 0, 1 o 2+. También necesito obtener todo después de los espacios en blanco principales, como un ajuste de Java. – hvgotcodes

4

Sólo puede hacer:

" aaa".replace(/^(\s*).*$/,"$1").length 
+1

Parece que no funciona cuando hay cero espacios iniciales: devuelve la longitud de la palabra completa. – jfriend00

+0

gracias, cambié el + al * – Enki

2

No estoy seguro de que haría uso de una expresión regular en la vida real para este trabajo, pero puede hacer coincidirlos en una captura y ver su longitud:

function countLeadingSpaces(str) { 
    return(str.match(/^(\s*)/)[1].length; 
} 

una manera no regex diseñado para la velocidad (casi cualquier cosa es rápido en comparación con una expresión regular):

function countLeadingSpaces2(str) { 
    for (var i = 0; i < str.length; i++) { 
     if (str[i] != " " && str[i] != "\t") { 
      return(i); 
     } 
    } 
    return(str.length); 
} 
+1

¿Por qué no utilizar '\ s *' y deshacerse de la verificación de "coincidencias" por completo? – paxdiablo

+0

'/^(\ s *) [^ \ t] /' de una cadena vacía devuelve nulo, lo que significa que no puede eliminar directamente '[1] .length' en una coincidencia utilizándola sin algún tipo de comprobación. No estoy sugiriendo que mi método sea el más compacto, pero estaba tratando de ser seguro para todos los casos extremos. – jfriend00

+1

aah, ya veo, pero creo que está devolviendo nulo, ya que no puede encontrar el bit '[\ t]'. Como las expresiones regulares son codiciosas de todos modos, puedes usar '^ (\ s *)' solo. – paxdiablo

0

Por qué no sólo tiene que utilizar un grupo de captura y comprobar la longitud:

<html> 
    <head> 
    </head> 
    <body> 
     <script language="javascript"> 
      var myStr = " hello"; 
      var myRe = /^(\s*)(.*)$/; 
      var match = myRe.exec(myStr); 
      alert(match[1].length); // gives 2 
      alert(match[2]);   // gives "hello" 
     </script> 
    </body> 
</html 

Esto puede ir seguido de un código que actúa en sus tres casos, una longitud de 0, 1 o de lo contrario, y actúa en el resto de la cadena.

Debe tratar las expresiones regulares como la herramienta que son, no como una caja de herramientas completa .

1

Puede encontrar el índice del primer carácter que no sea espacio en la cadena, , que es el mismo que el número de caracteres iniciales en blanco.

t.search(/\S/); 

Si insiste puede limitar el retorno a 0, 1 ó 2 con Math.min(t.search(/\S/), 2);

Si hay no caracteres no espaciales el retorno será -1 ....

Cuestiones relacionadas