2012-11-08 9 views
5

W Ruby 1.9.3 silnik regex nie traktuje nbsp (\ u00A0) jako spacji (\ s). Często jest to dla mnie ułomne.Obsługa regexp ruby ​​w nbsp

Moje pytanie brzmi, czy to zmieni się na 2.0? Jeśli nie, czy istnieje jakiś sposób na rozwiązanie problemu z małpką?

Odpowiedz

7

właściwości używać Unicode (trzeba zadeklarować kodowanie kodu dopasowanie źródłowy dla tej pracy):

# encoding=utf-8 
if subject ~= /\p{Z}/ 
    # subject contains whitespace or other separators 

lub użyj POSIX klas postaci:

if subject ~= /[[:space:]]/ 

Według the docs, \s będzie tylko mecz [ \t\r\n\f] teraz i w przyszłości.

+0

Dzięki Tim, \ p {Z} jest interesujący. Czy możesz wyjaśnić, co masz na myśli przez inne separatory? – pguardiario

+0

@pguardiario: Przepraszam, jakoś tęskniłem za twoim komentarzem. Standard Unicode definiuje wiele innych separatorów, które wydają się być używane głównie w językach wschodnich, gdzie słowa nie są wyraźnie oddzielone białymi znakami. –

0

W Ruby, polecam użyciu klasy znaków Unicode "Kosmicznych separatorów" \p{Zs}:

/\p{Zs}/u =~ "\xC2\xA0" 
/\p{Zs}/u =~ "\u00A0" 
/\p{Zs}/u =~ HTMLEntities.new.decode(' ') 

Zobacz Ruby-dokumentacją więcej Unicode character properties.

Uwaga: Upewnij się, że Twój ciąg wejściowy jest prawidłowym kodowaniem UTF-8. W innych kodowaniach istnieją również przestrzenie nierozdzielające, np. "\ xA0" w ISO-8859-1 (Latin1). More info on the "non-breaking space".

FYI: W większości smaków i języków programowania RegExp obsługujących Unicode, klasa znaków \s zwykle zawiera wszystkie znaki z "separatora" Unicode o właściwości \p{Z} (jak wspomniał Tim Pietcker); Jednakże, Java i Ruby są tutaj popularnymi wyjątkami, a \s pasuje tylko do [ \t\r\n\f].