2009-05-28 21 views
16

Spesso mi dimentico dei modificatori di espressioni regolari m e s e delle loro differenze. Qual è un buon modo per ricordarli?Differenza tra i modificatori di espressioni regolari 'm' e 's'?

Come li capisco, sono:

'm' è per multilinea, in modo che ^ e $ corrisponderà inizio di corda e alla fine di stringa più volte. (Come diviso da \n)

's' è così che il punto corrisponderà anche il carattere di nuova riga

Spesso, mi basta usare

/some_pattern/ism 

Ma probabilmente è meglio usarli di conseguenza (di solito "s" nei miei casi).

Cosa pensi possa essere un buon modo per ricordarli, invece di dimenticare quale è ogni volta?

risposta

16

Non è raro trovare qualcuno che utilizza regex da anni che ancora non capisce come funzionano quei due modificatori. Come hai osservato, i nomi "multiline" e "singleline" non sono molto utili. Sembra che debbano essere mutuamente esclusivi, ma sono completamente indipendenti. Suggerisco di ignorare i nomi e concentrarsi su quello che fanno: m modifica il comportamento degli ancoraggi (^ e $) e s modifica il comportamento del punto (.).

Una persona importante che ha confuso le modalità è l'autore di Ruby. Ha creato la propria implementazione di regex basata su Perl's, tranne che ha deciso di avere ^ e $ essere sempre ancore di linea, ovvero la modalità multilinea è sempre attiva. Sfortunatamente, ha anche erroneamente chiamato la modalità dot-matches-everything multiline. Quindi Ruby non ha il modificatore s, ma il suo modificatore m fa quello che s fa in altri sapori.

Come per l'utilizzo sempre /ism, mi raccomando contro di esso. È in gran parte innocuo, come hai scoperto, ma invia un messaggio confuso a chiunque stia cercando di capire che cosa dovrebbe fare la regex (o anche a te stesso, in futuro).

+0

cosa succede se in Ruby, voglio che corrisponda solo all'inizio e alla fine di stringa, ignorando il \ n? –

+1

Quindi si utilizza \ A e \ z. Quelli sono disponibili anche nella maggior parte degli altri sapori; semplicemente non li vedi molto usati. –

10

mi piace la spiegazione di 'uomo perlre':

m stringa trattare come m linee ù.
s Tratta stringa come s linea ingles.

Con più righe,^e $ si applicano a singole righe (ad esempio prima e dopo le nuove linee).
Con una sola riga,^e $ si applicano all'intero e \ n diventa semplicemente un altro carattere che è possibile abbinare.

[Errato] Usando entrambi i parametri come descritto, mi aspetto che il secondo abbia la precedenza, quindi si dovrebbe sempre essere in modalità multilinea con/ism. [/ errato]

non ho letto abbastanza lontano:
I "/ s" e modificatori "/ m" sia la priorità l'impostazione $ *. Cioè, non importa cosa contenga $ *, "/ s" senza "/ m" costringerà "^" a corrispondere solo all'inizio della stringa e "$" a corrispondere solo alla fine (o appena prima di una nuova riga a la fine) della stringa. Insieme, come/ms, hanno lasciato il "." abbinare qualsiasi carattere qualunque, consentendo comunque "^" e "$" di corrispondere, rispettivamente, subito dopo e appena prima delle nuove righe all'interno della stringa.

+0

hm ... è vero che se non usiamo "m" o "s", allora non è né una linea multipla né una linea singola? penseresti che debba essere uno dei due. –

+0

a proposito, questo modo di descriverlo renderà un conflitto per^e $ se usiamo sia 'm' sia 's' ... sto usando la def da PHP ... quindi forse la def è una un po 'diverso su un'altra piattaforma. –

1

forse in questo modo, non dimenticherò mai:

quando voglio abbinare attraverso le linee, io naturalmente pensare (di solito utilizzando * per abbinare qualcosa che non importa se si estendono su tutta la linea multipla.?) di multilinea, e quindi, 'm'. Beh, "m" non è in realtà quello, quindi è "s".

(dato che ricordo già "ism" così bene ... così posso sempre ricordare che non è "m", quindi deve essere "s").

altro tentativo zoppo comprende:

s è per DOTALL, è per DOT da abbinare ALL.
m è multilinea - è per ^ e $ per abbinare un sacco di volte.

+3

s è per "super match", quindi puoi anche abbinare caratteri invisibili;) – JimG

+0

@JimG è una delle cose più divertenti che abbia mai letto su StackOverflow –

Problemi correlati