Was ist der Unterschied zwischen [\ s \ S] *? und .*?

8

Ich habe das folgende Token in einem regulären Ausdruck gefunden: [\s\S]*?

Wenn ich das richtig verstehe, bedeutet die Zeichenklasse "Übereinstimmung mit einem Leerzeichen oder einem Nicht-Leerzeichen". Würde dies also nicht genau dasselbe tun wie .*?

Ein möglicher Unterschied ist, dass . normalerweise nicht mit Zeilenumbrüchen übereinstimmt. Dieser reguläre Ausdruck wurde jedoch in Ruby geschrieben und wurde an m Modifikator übergeben, was bedeutet, dass . dies tut In der Tat, passen Sie Zeilenumbrüche.

Gibt es einen anderen Grund, [\s\S]*? anstelle von .*?

zu verwenden?

Falls es hilft, erscheint der reguläre Ausdruck, den ich sehe, in der Ritzel-Bibliothek in der Konstante HEADER_PATTERN in Zeile 97. Der vollständige Ausdruck lautet:

%Vor%     
Rupert Madden-Abbott 29.05.2011, 16:14
quelle

3 Antworten

6

Sie haben die Regex korrekt interpretiert.

Das scheint ein Relikt von anderen Sprachen zu sein, die das m-Flag (oder das S-Flag in anderen Implementierungen) nicht unterstützen.

Ein Grund, dieses Konstrukt zu verwenden, wäre, das m-Flag nicht zu verwenden, damit Sie es verwenden können. ohne übereinstimmende Zeilenumbrüche, aber sind immer noch in der Lage, alles bei Bedarf anzupassen.

    
marsbear 29.05.2011, 16:20
quelle
0

Mit dem m-Flag wären sie gleich, außer dass .* viel übersichtlicher und einfacher zu pflegen wäre.

    
Trott 29.05.2011 16:21
quelle
0

Das Newline-Ding ist der einzige Unterschied. Vielleicht dachte jemand, es sei leichter zu lesen, ohne den Kontext m kennen zu müssen, oder er wollte, dass es gegen eine Änderung dieses Kontextes robust ist.

Ich habe [^]* für einen ähnlichen Zweck verwendet.

    
Nemo 29.05.2011 16:21
quelle

Tags und Links