13

Ruby/[[:punct:]]/はすべての「句読点」に一致するはずです。Wikipediaによると、これは/[\]\[!"#$%&'()*+,./:;<=>?@\^_`{|}~-]/POSIX 標準を意味します。

一致します: -[]\;',./!@#%&*()_{}::"?.

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

何を与える?

4

2 に答える 2

11

句読点の文字クラスは、ロケールによって定義されます。punctの Open Group LC_TYPE 定義には、次のように記載されています。

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

基本的に、それは他の文字クラスを除外することによってどのように句点を定義できるかを定義しますが、句読点記号を実際に直接定義するわけではありません。それがロケールの仕事です。

各ロケールに何があるかについての正規の参照が見つかりませんでした。多分他の誰かが知っています。一方、必要なパンクト文字クラスに一致する LC_TYPE を見つけるか、クラスを直接指定することができます。

于 2012-06-21T01:53:48.620 に答える
2

大なり記号は、句読点のカテゴリではなく、「記号、数学」カテゴリにあります。正規表現のエンコーディングを UTF-8 に強制すると、これを確認できます (デフォルトはソース エンコーディングであり、おそらくソースは UTF-8 でエンコードされていますが、私のデフォルト ソースは別のものです)。

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

正規表現を強制的に ASCII エンコーディング (/n - その他のオプションはこちら) にすると、'<' がパンクトに分類されることがわかります。ただし、ソースに UTF-8 の ASCII サブセット以外の文字が含まれている場合は、おそらく問題が発生します。

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

より良い解決策は、UTF-8 エンコーディングの「<」に一致する「punct」カテゴリの代わりに、正規表現で「Symbol」カテゴリを使用することです。

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

ここにカテゴリの長いリストがあります。

于 2014-09-17T12:39:58.317 に答える