2012-06-21 4 views
12

Ruby /[[:punct:]]/ soll alle "Interpunktionszeichen" übereinstimmen. Laut Wikipedia bedeutet dies /[\]\[!"#$%&'()*+,./:;<=>[email protected]\^_`{|}~-]/ pro POSIX-Standard.Warum Ruby/[[: punct:]]/einige Interpunktionszeichen verpassen?

Es entspricht: -[]\;',./[email protected]#%&*()_{}::"?.

Es wird jedoch nicht Spiel: =`~$^+|<> (zumindest in rubin 1.9.3p194).

Was gibt?

+3

Meine Glibc-Dokumentation besagt, dass '[[: punct:]]' mit allem übereinstimmen sollte, was 'wctype (3)' ein Interpunktionszeichen aufruft; Die 'ispunct (3)' Seite sagt '' prüft auf jedes druckbare Zeichen, das kein Leerzeichen oder ein alphanumerisches Zeichen ist.' Das scheint ziemlich explizit zu sein. – sarnold

+1

[Rubys RE-Engine ist allerdings etwas Besonderes] (http://www.geocities.jp/kosako3/oniguruma/doc/RE.txt) - es gibt Dokumentation zu Unicode-Case und Nicht-Unicode-Case für die ' punct' Klasse. Ich bin mir noch nicht sicher, was das konkret bedeutet, aber ich hoffe, das hilft. – sarnold

Antwort

10

Die Interpunktionsklasse wird durch das Gebietsschema definiert. Die offene Gruppe LC_TYPE definition for punct sagt:

Definieren Sie Zeichen, die als Interpunktionszeichen klassifiziert werden sollen. Im POSIX-Gebietsschema dürfen weder die <space> noch irgendwelche Zeichen in den Klassen alpha, digit oder cntrl enthalten sein. In einer Gebietsschemendefinitionsdatei darf kein für die Schlüsselwörter oberer, unterer, Alpha, Digit, Cntrl, Xdigit oder als die Schlüsselwörter angegebenes Zeichen angegeben werden.

Grundsätzlich definiert es wie punct kann durch gewählten Art anderen Zeichenklassen definiert werden, aber es nicht wirklich die Satzzeichen direkt definieren -, dass die Aufgabe des Gebietsschema ist.

Ich konnte keinen kanonischen Verweis auf das finden, was in jedem Gebietsschema ist. Vielleicht weiß es jemand anderes. In der Zwischenzeit können Sie einen LC_TYPE finden, der der punct Zeichenklasse entspricht, die Sie möchten, oder einfach nur die Klasse direkt angeben.

+0

FWIW, mein Locale ist Rails Standard 'en' (dasselbe gilt auch für non-Rails plain irb, und mein OS ist' en_US'). Irgendwelche Vorschläge, wie man das beheben kann (außer nur explizit zu sein)?Ich hoffe, es gibt nicht mehr zufällig gotchas ... – Sai

1

Das Größer-als-Symbol ist in der "Symbol, Math" category, nicht die Interpunktionskategorie. Sie können das sehen, wenn Sie die Codierung der Regex zwingen, UTF-8 (wird standardmäßig die Quellencodierung und vermutlich Ihre Quelle ist UTF-8 codiert, während meine Standardquelle etwas anderes ist):

2.1.2 :004 > /[[:punct:]]/u =~ '<' 
=> nil 
2.1.2 :005 > /[[:punct:]]/ =~ '<' 
=> 0 

Wenn Sie zwingen Sie die Regex auf ASCII-Codierung (/ n - mehr Optionen here) Sie sehen es kategorisieren "<" in punct, was ich denke, was Sie wollen. Dies führt jedoch wahrscheinlich zu Problemen, wenn Ihre Quelle Zeichen außerhalb der ASCII-Untermenge von UTF-8 enthält.

2.1.2 :009 > /[[:punct:]]/n =~ '<' 
=> 0 

Eine bessere Lösung, um die 'Symbol' Kategorie statt in Ihrem regulären Ausdruck anstelle des 'punct' ein, zu verwenden, wäre die '<' entspricht in Codierung UTF-8:

2.1.2 :012 > /\p{S}/u =~ '<' 
=> 0 

Es gibt eine längere Liste von Kategorien here.

+0

Symbol enthält keine tatsächlichen Interpunktionen wie ',.:" '. Eine Kombination der 2 umfasst alle" Interpunktion "Zeichen (wie von POSIX definiert) im ASCII-Bereich. Währungszeichen, Copyright-Zeichen, Pfeile und verschiedene andere Symbole werden jedoch ebenfalls enthalten sein, wenn wir eine Kombination der allgemeinen Kategorie Symbol und Interpunktion verwenden. – nhahtdh

Verwandte Themen