Pregunta

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

Según tengo entendido son:

'm' es para varias líneas, por lo que ^ y $coincidirá con el comienzo de la cadena y el final de la cadena varias veces.(como dividido por \n)

's' es para que el punto coincida incluso con el carácter de Newline

A menudo, sólo uso

/some_pattern/ism

Pero probablemente sea mejor usarlos en consecuencia (generalmente "s" en mis casos).

¿Cuál crees que puede ser una buena forma de recordarlos, en lugar de olvidar cada vez cuál es cuál?

¿Fue útil?

Solución

No es raro encontrar a alguien que ha estado usando expresiones regulares durante años que todavía no entienden cómo funcionan estos dos modificadores. A medida que ha observado, los nombres de "varias líneas" y "SingleLine" no son muy útiles. Aunque parezca que lo deben ser mutuamente excluyentes, pero son completamente independientes. Le sugiero que ignora los nombres y concentrarse en lo que hacen: m cambia el comportamiento de los anclajes (^ y $), y s cambia el comportamiento del punto (.)

.

A una persona prominente que mezclan los modos es el autor de Ruby. Creó su propia implementación de expresiones regulares basado en Perl, a menos que él decidió tener ^ y $ siempre anclas de línea - es decir, modo multilínea siempre está encendido. Por desgracia, también llamó incorrectamente el modo de punto-partidos-todo multilínea . Así Ruby tiene ningún modificador s, pero su modificador m hace lo que hace s en otros sabores.

En cuanto a utilizar siempre /ism, recomiendo en contra de ella. Es en su mayoría inofensivas, como usted ha descubierto, pero envía un mensaje confuso para cualquier persona que está tratando de averiguar lo que se suponía que la expresión regular para hacer (o incluso a sí mismo, en el futuro).

Otros consejos

Me gusta la explicación en 'man perlre':

metro Trate la cuerda como metroLíneas múltiples.
s Trate la cuerda como suna sola línea.

Con varias líneas, ^ y $ se aplican a líneas individuales (es decir,justo antes y después de las nuevas líneas).
Con una sola línea, ^ y $ se aplican al conjunto, y simplemente se convierte en otro carácter que puedes igualar.

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

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

quizá de esta manera, que nunca olvidaré:

cuando quiero coincidir través de las líneas (generalmente usando. *? Para que coincida con algo que no importa si se extienden a través de varias líneas), i naturalmente a pensar en varias líneas, y por lo tanto, 'm'. Bueno, 'm' en realidad no es la única, por lo que es 's'.

(puesto que ya recuerdo 'ismo' tan bien ... por lo que puedo recordar siempre 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 consta de varias líneas -. que es para ^ y $ para que coincida con un montón de veces

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top