2012-06-21 5 views
12

Ruby /[[:punct:]]/はすべての "句読記号"と一致するはずです。 Wikipediaによれば、これはPOSIX標準に準拠して/[\]\[!"#$%&'()*+,./:;<=>[email protected]\^_`{|}~-]/を意味します。なぜRuby/[[:punct:]] /句読文字が欠けていますか?

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

ただし、ではなく、と一致します。=`~$^+|<>(少なくともルビ1.9.3p194では)。

何がありますか?

+3

glibcのドキュメントでは、 '[[:punct:]]'は 'wctype(3)'が句読点を呼び出すものと一致する必要があります。 'ispunct(3)'のページに ''スペースか英数字ではない印字可能な文字があるかどうかを調べます。それはかなり明白なようです。 – sarnold

+1

[RubyのREエンジンは特別ですが](http://www.geocities.jp/kosako3/oniguruma/doc/RE.txt) - Unicodeの場合とUnicodeでない場合の両方のドキュメントがあります。 punctクラス。私はまだこれが何を意味しているのかはっきりしていませんが、これが助けてくれることを望みます。 – sarnold

答えて

10

句読点文字クラスは、ロケールによって定義されます。オープングループLC_TYPE definition for punctのコメント:

句読記号として分類される文字を定義します。 POSIXロケールでは、<space>もalpha、digit、またはcntrlクラスの文字も含まれません。ロケール定義ファイルでは、キーワードupper、lower、alpha、digit、cntrl、xdigit、またはのように指定された文字は指定されません。

は基本的に、それはPUNCTが他の文字クラスをexludingで定義することができる方法を定義し、それが実際に直接句読点記号を定義していない - それは、ロケールの仕事です。

各ロケールに含まれるものに対する標準的な参照が見つかりませんでした。多分誰かが知っているでしょう。一方、希望する文字クラス文字クラスに一致するLC_TYPEを見つけるか、クラスを直接指定するだけです。

+0

FWIW、私のロケールはRailsのデフォルト 'en'です(非Railsのplain irbでも同じですが、OSは' en_US'です)。これを修正する方法に関する提案(明示的なもの以外)?... – Sai

1

大なり記号は、句読点カテゴリではなく、"Symbol, Math" categoryにあります。あなたの場合は

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

:(私のデフォルトのソースは何か他のものである一方、ソースのエンコーディングにはデフォルトを、そしておそらくあなたのソースは、UTF-8でエンコードされている)あなたはUTF-8に正規表現のエンコーディングを強制する場合は、これを見ることができます正規表現をASCIIエンコーディング(/ n - more options here)にすると、 '<'がpunctに分類されていることがわかります。これはあなたが望むものだと思います。しかし、ソースにUTF-8のASCIIサブセット以外の文字が含まれていると、これはおそらく問題を引き起こします。

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

があります:

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

よりよい解決策は、UTF-8エンコーディングで「<」にマッチした、1「PUNCT」のではなく、代わりに正規表現で「シンボル」のカテゴリを使用することですカテゴリの長いリストhere

+0

シンボルに '、。:"などの実際の句読点は含まれていません.2の組み合わせは、ASCII範囲のすべての "句読点"文字(POSIXで定義されています)をカバーしています。ただし、SymbolとPunctuationの一般的なカテゴリを組み合わせて使用​​する場合は、通貨記号、著作権表示、矢印などの記号も含まれます。 – nhahtdh

関連する問題