usos tag signo regulares manager interrogacion google expresiones regex modifiers

regex - tag - signo de interrogacion en expresiones regulares



¿Diferencia entre los modificadores de expresión regular ''m'' y ''s''? (3)

A menudo me olvido de los modificadores de expresión regular mys y sus diferencias. ¿Cuál es una buena manera de recordarlos?

Como los entiendo, ellos son:

''m'' es para multilínea, de modo que ^ y $ coincidirán el principio 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 nueva línea

A menudo, solo uso

/some_pattern/ism

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

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


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

m Tratar la cuerda como m ultiples lineas.
s Trate la cuerda como si fuera una 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 / n simplemente se convierte en otro personaje que puede igualar.

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

No leí lo suficiente
Los modificadores "/ s" y "/ m" anulan la configuración $ *. Es decir, sin importar lo que $ * 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 cadena. Juntos, como / ms, dejaron el "." haga coincidir cualquier carácter, sin dejar de permitir que "^" y "$" coincidan, respectivamente, justo después y justo antes de las nuevas líneas dentro de la cadena.


No es raro encontrar a alguien que haya estado utilizando expresiones regulares durante años y que todavía no entienda cómo funcionan esos dos modificadores. Como observó, los nombres "multilínea" y "línea simple" 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 los anclajes ( ^ y $ ), y s cambia el comportamiento del punto ( . ).

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

En cuanto a usar siempre /ism , lo recomiendo. Como ha descubierto, en su mayoría es inofensivo, pero envía un mensaje confuso a cualquier otra persona que esté tratando de averiguar qué se supone que debe hacer la expresión regular (o incluso a usted mismo, en el futuro).


Tal vez de esta manera, nunca olvidaré:

cuando quiero hacer coincidencias entre líneas (generalmente utilizando. *? para hacer coincidir algo que no importa si abarca varias líneas), naturalmente pensaré en multilínea y, por lo tanto, ''m''. Bueno, ''m'' no es en realidad el único, así que es ''s''.

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

otro intento cojo incluye:

s es para DOTALL, es para que DOT coincida con TODOS.
m es multilínea - es para que ^ y $ coincidan muchas veces.