2012-06-21 16 views
12

Ruby /[[:punct:]]/, tüm "noktalama karakterleri" ile eşleşmesi gerekir. Wikipedia'a göre, bu, POSIX standardı başına /[\]\[!"#$%&'()*+,./:;<=>[email protected]\^_`{|}~-]/ anlamına gelir.Neden Ruby/[[: punct:]]/bazı noktalama karakterlerini özlüyor?

Eşleşme: -[]\;',./[email protected]#%&*()_{}::"?. Ancak, no eşleşmesi: =`~$^+|<> (en azından ruby ​​1.9.3p194) 'a göre yapar.

Ne verir?

+3

Glibc belgelerim, '[[: punct:]]' 'wctype (3) '' nin noktalama işareti olarak adlandırdığı herşeyle eşleşmesi gerektiğini; 'ispunct (3)' sayfası, boşluk veya alfasayısal karakter olmayan yazdırılabilir karakterleri kontrol eder. Bu oldukça açık görünüyor. – sarnold

+1

[Ruby'nin RE motoru özel olsa da] (http://www.geocities.jp/kosako3/oniguruma/doc/RE.txt) - hem Unicode-case hem de Unicode-case için belgeler var. punct' sınıfı. Bunun ne anlama geldiğini hala bilmiyorum ama umarım bu yardımcı olur. – sarnold

cevap

10

Noktalama karakter sınıfı, yerel ayar tarafından belirlenir. Açık Grup LC_TYPE definition for punct diyor:

Noktalama karakterleri olarak sınıflandırılacak karakterleri tanımlayın. POSIX yerel ayarında ne <space> ne de alfa, digit veya cntrl sınıflarındaki herhangi bir karakter eklenmez. Bir yerel tanım dosyasında, üst, alt, alfa, rakam, cntrl, xdigit veya belirtildiği gibi anahtar kelimeler için hiçbir karakter belirtilmez.

Temelde, punct diğer karakter sınıfları exluding tanımlanabilir nasıl tanımlar, ama aslında doğrudan noktalama sembolleri tanımlamak değildir - bu yerelin işidir.

Her yerel ayarda ne olduğu konusunda kanonik bir başvuru bulamadım. Belki başkası biliyordur. Bu arada, istediğiniz punct karakter sınıfıyla eşleşen bir LC_TYPE bulabilir veya doğrudan sınıfı belirtebilirsiniz.

+0

FWIW, yerel ayarlarım Rails 'default 'tr'dir (aynı şekilde Rails düz olmayan irb ile aynıdır ve işletim sistemim' tr_tr). Bunu nasıl düzelteceğinize dair herhangi bir öneri (sadece açık olmaktan başka)?Ben daha rasgele gotchas yok umuyoruz… – Sai

1

Sembolden büyük olan nokta, noktalama kategorisi değil "Symbol, Math" category. Eğer

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

: (varsayılan kaynak başka bir şey ise, kaynak kodlaması için bu varsayılan ve tahminen kaynak, UTF-8 kodlu olduğu) UTF-8'e Regex kodlamasını zorlamak durumunda bu görebilirsiniz ASCII kodlamaya (/ n - daha fazla seçenek here) karşı regex'i zorlarsınız, '<' kategorisini kategorize eder. Ancak, kaynağınız UTF-8'in ASCII alt kümesinin dışındaki karakterleri içeriyorsa, bu sorunlara neden olabilir.

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

var:

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

Daha iyi bir çözüm UTF-8 kodlamasında '<' maçları hangi bir 'punct' yerine yerine regex 'Sembol' kategorisini kullanmak olacaktır here kategorilerinin daha uzun bir listesi.

+0

Symbol, ",.:" Gibi gerçek noktalama işaretleri içermez. 2'nin birleşimi, tüm "noktalama işaretleri" karakterlerini (POSIX ile tanımlandığı gibi) ASCII aralığını kapsar. Bununla birlikte, Sembol ve Noktalama genel kategorisinin bir kombinasyonunu kullanırsak para işaretleri, telif hakkı işareti, oklar ve diğer çeşitli semboller de dahil edilecektir. – nhahtdh

İlgili konular