2011-05-29 17 views
8

que he encontrado el siguiente token en una expresión regular: [\s\S]*?¿Cuál es la diferencia entre [ s S] *? y. *?

Si entiendo correctamente, la clase de caracteres significa "coincide con un carácter de espacio en blanco o una no está en blanco". Por lo tanto, esto no haría exactamente lo mismo que .*?

Una posible diferencia es que generalmente . no coincide con las nuevas líneas. Sin embargo, esta expresión regular se escribió en Ruby y se aprobó el m modifier, lo que significa que el . hace, de hecho, coincide con las nuevas líneas.

¿Hay alguna otra razón para usar en lugar de [\s\S]*?.*?

En caso de que ayuda, la expresión regular que estoy mirando aparece dentro de la sprockets library en la constante HEADER_PATTERN en la línea 97. La expresión completa es:

/ 
    \A \s* (
    (\/\* ([\s\S]*?) \*\/) | 
    (\#\#\# ([\s\S]*?) \#\#\#) | 
    (\/\/ ([^\n]*) \n?)+ | 
    (\# ([^\n]*) \n?)+ 
) 
/mx 
+0

Comparto su especulación. Tal vez, podría ser útil si nos proporciona el regxp completo o el contexto en el que se usa. – sawa

+0

@sawa Esa es una buena idea, gracias. He editado mi pregunta. –

+0

Gracias por agregar la expresión regular. Ahora, parece aún más extraño porque está usando 'm', y está atando para tratarlo usando' [^ \ n] '. – sawa

Respuesta

6

Interpretaste la expresión regular correctamente.

Eso parece como un vestigio de otros idiomas que no apoyan la m-bandera (o s-bandera en otras implementaciones).

Una razón para utilizar esa construcción sería no utilizar el m-bandera por lo que tiene la posibilidad de usar. sin coincidir con líneas nuevas, pero aún así pueden hacer coincidir todo si es necesario.

+0

Eso es una gran idea y un posible caso de uso –

+6

Esta podría ser la respuesta correcta. Sin embargo, ruby ​​tiene una notación para este propósito: '(? M:.)'. Esto pondrá '.' en modo' m' sin hacer toda la expresión regular en el modo 'm'. Quien usó la expresión regular original no está haciendo una buena codificación. – sawa

+0

@sawa Acepto ambas declaraciones – marsbear

0

Con la bandera m, que sería lo mismo, excepto que .* sería mucho más claro y más fácil de mantener.

0

Lo nuevo es la única diferencia. Quizás alguien pensó que era más fácil de leer sin tener que conocer el contexto m, o quería que fuera sólido frente a un cambio en ese contexto.

He visto [^]* usado para un propósito similar.

Cuestiones relacionadas