2009-05-28 9 views
16

Ich vergesse oft die regulären Ausdruck Modifikatoren m und s und ihre Unterschiede. Was ist eine gute Möglichkeit, sich an sie zu erinnern?Unterschied zwischen den regulären Ausdrucksmodifikatoren 'm' und 's'?

Als ich sie verstehen, sie sind:

‚m‘ ist für mehrzeilige, so dass ^ und $ wird Anfang Zeichenfolge übereinstimmen und Schnur mehrmals beenden. (Als geteilte von \n)

's' ist, so dass der Punkt übereinstimmen auch das Newline-Zeichen

Oft benutze ich nur

/some_pattern/ism 

Aber es ist wahrscheinlich besser, verwende sie entsprechend (normalerweise "s" in meinen Fällen).

Was denken Sie, kann ein guter Weg sein, sich an sie zu erinnern, anstatt zu vergessen, welches ist was jedes Mal?

Antwort

16

Es ist nicht ungewöhnlich, jemanden zu finden, der seit Jahren Regex verwendet, der immer noch nicht versteht, wie diese beiden Modifikatoren funktionieren. Wie Sie gesehen haben, sind die Namen "multiline" und "single line" nicht sehr hilfreich. Sie klingen, als müssten sie sich gegenseitig ausschließen, aber sie sind völlig unabhängig. Ich schlage vor, Sie ignorieren die Namen und konzentrieren sich auf das, was sie tun: m ändert das Verhalten der Anker (^ und $), und s ändert das Verhalten des Punktes (.).

Eine prominente Person, die die Modi durcheinander gebracht hat, ist der Autor von Ruby. Er hat seine eigene Regex-Implementierung basierend auf Perls erstellt, außer dass er entschieden hat, ^ und $ immer Linienanker zu haben - das heißt, der Mehrzeilenmodus ist immer an. Leider hat er auch den Modus dot-matches-everything multiline falsch benannt. So hat Rubin keinen s Modifizierer, aber sein Modifikator m macht, was s in anderen Aromen tut.

Wie immer /ism verwenden, empfehle ich dagegen. Es ist größtenteils harmlos, wie du herausgefunden hast, aber es sendet eine verwirrende Nachricht an jeden anderen, der versucht herauszufinden, was die Regex tun sollte (oder sogar zu dir selbst, in der Zukunft).

+0

gelesen habe, wenn ich in Ruby nur Anfang und Ende übereinstimmen soll der Zeichenfolge, ignorieren die \ n? –

+1

Dann verwenden Sie \ A und \ z. Diese sind auch in den meisten anderen Geschmacksrichtungen erhältlich; Sie sehen sie nur selten. –

10

Ich mag die Erklärung in 'Mann perlre':

m Treat String als m ehrere Linien.
s Behandeln Sie die Zeichenfolge als s Zeile Zeile.

Bei mehreren Zeilen gelten^und $ für einzelne Zeilen (d. H. Unmittelbar vor und nach Zeilenumbrüchen).
Mit einer einzigen Zeile,^und $ gelten für das Ganze, und \ n wird nur ein anderes Zeichen, das Sie zuordnen können.

[Wrong] durch beide m und s mit, wie Sie beschrieben, würde ich die zweite erwarten Vorrang zu nehmen, so dass Sie würde immer mit/ism in mehrzeiligen Modus. [/ Falscher]

Ich habe nicht weit genug lesen:
Die "/ s" und "/ m" Modifikatoren sowohl die Einstellung $ * außer Kraft setzen. Das heißt, egal was $ * enthält, "/ s" ohne "/ m" bewirkt, dass "^" nur am Anfang des Strings und "$" nur am Ende (oder kurz vor einem Zeilenumbruch bei das Ende) der Saite. Zusammen, als/ms, lassen sie das "." passen Sie ein beliebiges Zeichen an, während Sie immer noch zulassen, dass "^" und "$" unmittelbar nach und unmittelbar vor Zeilenumbrüchen in der Zeichenfolge übereinstimmen.

+0

hm ... ist es wahr, dass wenn wir nicht 'm' oder 's' verwenden, es weder eine Mehrfachlinie noch eine Einzellinie ist? Du würdest denken, dass es eins sein muss. –

+0

Übrigens wird diese Art der Beschreibung es zu einem Konflikt für die^und $ machen, wenn wir sowohl 'm' als auch 's' benutzen ... ich benutze das def von PHP ... also vielleicht ist das def ein anders auf anderer Plattform. –

1

vielleicht auf diese Weise, werde ich nie vergessen:

, wenn ich über mehrere Zeilen übereinstimmen soll, werde ich natürlich denken (in der Regel mit * etwas Übereinstimmen, die es spielt keine Rolle, wenn über mehrere Zeilen umfasst.?) mehrzeilig und daher "m". Nun, 'm' ist eigentlich nicht der eine, also ist es 's'.

(da ich mich schon so gut an'ism 'erinnere ... so kann ich mich immer daran erinnern, dass es nicht' m 'ist, dann muss es' s 'sein).

andere lame Versuch beinhaltet:

s für DOTALL ist, ist es für DOT ist ALL anzupassen.
m ist mehrzeilig - es ist für ^ und $ oft anzupassen.

+3

s ist für "Super-Match", so können Sie sogar unsichtbare Zeichen passen;) – JimG

+0

@JimG das ist eines der lustigsten Dinge, die ich jemals auf Stackoverflow –

Verwandte Themen