2009-05-28 34 views
16

A menudo me olvido de los modificadores de expresiones regulares m y s y sus diferencias. ¿Cuál es una buena manera de recordarlos?Diferencia entre los modificadores de expresiones regulares 'm' y 's'?

Como yo los entiendo, ellos son:

'm' es para varias líneas, de manera que ^ y $ coincidirá comienzo de cuerda y terminar de veces de cadena múltiple. (Como se divide por \n)

's' es de manera que el punto coincidirá incluso el carácter de nueva línea

A menudo, sólo tiene que utilizar

/some_pattern/ism 

Pero probablemente es mejor utilícelos en consecuencia (generalmente "s" en mi caso).

¿Qué opinas puede ser una buena manera de recordar que, en lugar de olvido, que es lo que cada vez?

Respuesta

16

No es raro encontrar a alguien que ha estado usando expresiones regulares durante años y que todavía no entiende cómo funcionan esos dos modificadores. Como observó, los nombres "multilínea" y "línea única" no son muy útiles. Suenan como que deben ser mutuamente excluyentes, pero son completamente independientes. Le sugiero que ignore los nombres y se concentre en lo que hacen: m cambia el comportamiento de las anclas (^ y $) y s cambia el comportamiento del punto (.).

Una persona prominente que mezcló los modos es el autor de Ruby. Creó su propia implementación de expresiones regulares basada en la de Perl, excepto que decidió tener ^ y $, siempre con anclas de línea, es decir, el modo multilínea siempre está activado. Desafortunadamente, también denominó incorrectamente el modo punto-coincide con todo multiline. Entonces Ruby no tiene modificador s, pero su modificador m hace lo que s hace en otros sabores.

Como siempre usando /ism, recomiendo que no lo haga. En su mayor parte es inofensivo, como has descubierto, pero envía un mensaje confuso a cualquier persona que intente averiguar qué se suponía que debía hacer la expresión regular (o incluso a ti mismo, en el futuro).

+0

qué pasa si en Ruby, quiero que coincida solo principio y fin de cadena, ignorando el \ n? –

+1

Luego usa \ A y \ z. Esos están disponibles en la mayoría de los otros sabores, también; simplemente no los ves usados ​​mucho. –

10

me gusta la explicación de 'hombre perlre':

m cadena tratan como m líneas ultiple.
s cadena Tratar como s línea de la ingle.

Con múltiples líneas,^$ y se aplican a las líneas individuales (es decir, justo antes y después de los saltos de línea).
Con una sola línea,^y $ se aplican al todo, y \ n simplemente se convierte en otro personaje que puede coincidir.

[Incorrecto] Al usar tanto m como s como describió, esperaría que el segundo tenga prioridad, por lo que siempre estaría en modo multilínea con/ism. [/ incorrecto]

No he leído lo suficiente:
Los "/ s" y modificadores "/ m" tanto anulan la configuración $ *. Es decir, no importa qué $ * contenga, "/ s" sin "/ m" forzará "^" para que coincida solo al principio de la cadena y "$" para que coincida solo al final (o justo antes de una nueva línea en el final) de la cuerda. Juntos, como/ms, dejan pasar el "." unir cualquier personaje, permitiendo que "^" y "$" coincidan, respectivamente, justo antes y después de las nuevas líneas dentro de la cadena.

+0

hm ... ¿Es verdad que si no usamos 'm' o 's', entonces no es una línea múltiple ni una sola línea? usted pensaría que tiene que ser cualquiera. –

+0

por cierto, esta forma de describirlo hará que sea un conflicto para^y $ si usamos tanto 'm' como 's' ... estoy usando la definición de PHP ... así que tal vez la definición sea una un poco diferente en otra plataforma. –

1

quizá de esta manera, que nunca olvidaré:

cuando quiero igualar a través de líneas, voy a pensar de forma natural (por lo general con * para que coincida con algo que no importa si se extienden a través de varias líneas.?) de multiline, y por lo tanto, 'm'. Bueno, 'm' en realidad no es el uno, entonces es 's'.

(puesto que ya recuerdo 'ismo' tan bien ... así que siempre recuerdo que no es 'm', entonces debe ser 's').

otra pobre intento incluye:

s es para dotall, es por DOT para que coincida con ALL.
m es multilínea - es para ^ y $ para coincidir muchas veces.

+3

s es para "súper coincidencia", por lo que incluso puede coincidir con caracteres invisibles;) – JimG

+0

@JimG que es una de las cosas más divertidas que he leído en stackoverflow –

Cuestiones relacionadas