Warum wird in meinem Regex-Muster eine POSIX-Zeichenklasse verwendet, die zu unerwarteten Ergebnissen führt?

7

Ich habe ein merkwürdiges Perl-Verhalten festgestellt: Die Verwendung einer Posix-Zeichenklasse in einem Regexp ändert die Sortierreihenfolge für die resultierenden Strings vollständig.

Hier ist mein Testprogramm:

%Vor%

Wenn Sie mit [a-z] zu den auskommentierten Regexps wechseln, erhalten Sie die normale, lexikografische Sortierreihenfolge. Die Posix [: alpha:] - Zeichenklasse ergibt jedoch eine seltsame Sortierreihenfolge wie folgt:

%Vor%

Meine beste Vermutung ist, dass die Posix-Charakterklasse eine Art von lokalem Zeug aktiviert, von dem ich noch nie gehört habe und nicht danach gefragt habe. Ich nehme an, die logische Reaktion auf "Doktor, Doktor, es tut weh, wenn ich dieses mache!" ist, "gut, mach nicht das , dann!".

Aber kann mir jemand sagen, was hier passiert und warum? Ich benutze Perl 5.10, aber ich glaube, es funktioniert auch unter Perl 5.8.

    
comingstorm 25.02.2010, 09:44
quelle

3 Antworten

13

Die Zeichenklasse [:alpha:] steht für Alpha-Zeichen in regulären Perl-Ausdrücken, aber die eckigen Klammern bedeuten nicht , was sie normalerweise in regulären Ausdrücken tun. Du brauchst also:

%Vor%

Dies wird in perlre erwähnt:

  

Die POSIX-Zeichenklassensyntax

%Vor%      

ist ebenfalls verfügbar. Beachten Sie, dass die Klammern [ und ] Literal sind; Sie müssen immer in einem Zeichenklassenausdruck verwendet werden.

%Vor%     
Greg Hewgill 25.02.2010, 09:53
quelle
8
___ qstnhdr ___ Warum wird in meinem Regex-Muster eine POSIX-Zeichenklasse verwendet, die zu unerwarteten Ergebnissen führt? ___ qstntxt ___

Ich habe ein merkwürdiges Perl-Verhalten festgestellt: Die Verwendung einer Posix-Zeichenklasse in einem Regexp ändert die Sortierreihenfolge für die resultierenden Strings vollständig.

Hier ist mein Testprogramm:

%Vor%

Wenn Sie mit [a-z] zu den auskommentierten Regexps wechseln, erhalten Sie die normale, lexikografische Sortierreihenfolge. Die Posix [: alpha:] - Zeichenklasse ergibt jedoch eine seltsame Sortierreihenfolge wie folgt:

%Vor%

Meine beste Vermutung ist, dass die Posix-Charakterklasse eine Art von lokalem Zeug aktiviert, von dem ich noch nie gehört habe und nicht danach gefragt habe. Ich nehme an, die logische Reaktion auf "Doktor, Doktor, es tut weh, wenn ich dieses mache!" ist, "gut, mach nicht das , dann!".

Aber kann mir jemand sagen, was hier passiert und warum? Ich benutze Perl 5.10, aber ich glaube, es funktioniert auch unter Perl 5.8.

    
___ tag123perl ___ Perl ist eine prozedurale, allgemeine Programmiersprache für allgemeine Zwecke, die für ihre native Unterstützung von regulären Ausdrücken und String-Parsing-Funktionen bekannt ist. Bitte verwenden Sie diesen Tag für Fragen zu Perl im Allgemeinen. Für Dinge, die mit der neuen (aber verwandten) Sprache "Perl 6" zu tun haben, verwenden Sie bitte das perl6-Tag. Verwenden Sie für reguläre Ausdrücke nach Perl-Art in anderen Sprachen das Regex-Tag oder, falls sie auf der PCRE-Bibliothek basieren, das PCRE-Tag. ___ answer2333393 ___

Was du schreibst, ist Perl bei keiner Vorstellung. Sie können damit durchkommen, weil Sie warnings deaktiviert haben. Wenn Sie Warnungen verwendet hätten, hätte perl Ihnen das gesagt.

POSIX syntax [: :] belongs inside character classes in regex; marked by <-- HERE in m/([:alpha:] <-- HERE *)/ at j.pl line 4.

POSIX syntax [: :] belongs inside character classes in regex; marked by <-- HERE in m/([:alpha:] <-- HERE *)/ at j.pl line 8.

Stellen Sie sich das vor!

Nun, perl hätte dir auch gesagt:

Illegal character in prototype for main::namecmp : $a,$b at j.pl line 3.

weil Perl nicht C ist. Perl hat keine Funktionsprototypen von der Art, die Sie zu benutzen scheinen.

Eine bessere Möglichkeit, in Perl die exakt gleiche Funktionalität zu schreiben, ist:

%Vor%     
___ tag123sorting ___ Das Sortieren ist der Vorgang, bei dem eine Reihenfolge auf eine Objektgruppe angewendet wird. ___ tag123regex ___ Reguläre Ausdrücke stellen eine deklarative Sprache zur Verfügung, um Muster in Strings zu vergleichen. Sie werden häufig für die Überprüfung, Analyse und Umwandlung von Zeichenfolgen verwendet. Da reguläre Ausdrücke nicht vollständig standardisiert sind, sollten alle Fragen mit diesem Tag auch ein Tag enthalten, das die anwendbare Programmiersprache oder das entsprechende Werkzeug angibt. HINWEIS: Nach HTML-, JSON-, usw.-Regexen zu fragen, neigt zu negativen Reaktionen. Wenn es einen Parser dafür gibt, verwende stattdessen diesen. ___ answer2333069 ___

Die Zeichenklasse %code% steht für Alpha-Zeichen in regulären Perl-Ausdrücken, aber die eckigen Klammern bedeuten nicht , was sie normalerweise in regulären Ausdrücken tun. Du brauchst also:

%Vor%

Dies wird in perlre erwähnt:

  

Die POSIX-Zeichenklassensyntax

%Vor%      

ist ebenfalls verfügbar. Beachten Sie, dass die Klammern %code% und %code% Literal sind; Sie müssen immer in einem Zeichenklassenausdruck verwendet werden.

%Vor%     
___ answer2333070 ___

Weil Perl keine POSIX-Zeichenklassen in diesem Formular unterstützt. (Verwenden Sie %code% . Siehe @ Gregs Antwort )

Also

%Vor%

wird als Zeichenklasse interpretiert, die aus den Zeichen " %code% ", " %code% ", " %code% ", " %code% " und " %code% " besteht.

Nun, für Strings, die zu Beginn nicht %code% enthalten (wegen %code% ), z. " %code% " Die Übereinstimmung gibt eine leere Zeichenfolge zurück. Eine leere Saite ist natürlich kleiner als jede andere Saite, daher werden sie am Anfang arrangiert.

    
___
Sinan Ünür 25.02.2010 12:35
quelle
6

Weil Perl keine POSIX-Zeichenklassen in diesem Formular unterstützt. (Verwenden Sie [[:alpha:]] . Siehe @ Gregs Antwort )

Also

%Vor%

wird als Zeichenklasse interpretiert, die aus den Zeichen " a ", " h ", " l ", " p " und " : " besteht.

Nun, für Strings, die zu Beginn nicht [ahlp:] enthalten (wegen * ), z. " baa " Die Übereinstimmung gibt eine leere Zeichenfolge zurück. Eine leere Saite ist natürlich kleiner als jede andere Saite, daher werden sie am Anfang arrangiert.

    
kennytm 25.02.2010 09:53
quelle

Tags und Links