文字クラス(character class) とは角括弧 [ と ] で囲まれ、1個以上の文字を列挙したもので、 いずれかの1文字にマッチします。
/W[aeiou]rd/
は Ward, Werd, Wird, Word, Wurd のいずれかにマッチします。
文字クラス内のハイフン(-)は文字の範囲を表すメタ文字です。 例えば [abcd] という文字クラスは [a-d] と表すことができます。 複数の範囲指定をすることもできます。例えば [abcdpqrs] は [a-dp-s]と 表すこともできます。
文字クラスの [ の直後の文字がキャレット(^)である場合、列挙「されていない」 文字にマッチするようになります(これは否定文字クラスと呼ばれます)。
[^a-d]
はabcd以外の1文字にマッチします。
文字クラス内に別の文字クラスを含めることができます。 [a-z[0-9]] は [a-z0-9]と同じ意味を持ちます。これだけではあまり意味が ありませんが、文字クラスは && という、共通部分を取る演算をサポートして いるため、これと組合せることで意味を持ちます。
/[a-z[0-9]]/.match("y") # => #< MatchData "y">
/[a-z[0-9]]/.match("[") # => nil
r = /[a-w&&[^c-g]e]/ # ([a-w] かつ ([^c-g] もしくは e)) つまり [abeh-w] と同じ
r.match("b") # => #< MatchData "b">
r.match("c") # => nil
r.match("e") # => #
r.match("g") # => nil
r.match("h") # => #< MatchData "h">
r.match("w") # => #< MatchData "w">
r.match("z") # => nil
文字クラスでは、否定(^)範囲(-)共通部分(&&)列挙(並べる)という 演算が可能ですが、これらは - > (列挙) > && > ^ という順の結合強度を持ちます。
文字クラス内の3つのメタ文字を通常の文字の意味で使用したい場合には、 \ によってエスケープ する必要があります。
文字クラスの略記法
良く使われる文字クラスには省略記法が存在します。
\w 単語構成文字 [a-zA-Z0-9_]
\W 非単語構成文字 [^a-zA-Z0-9_]
\s 空白文字 [ \t\r\n\f\v]
\S 非空白文字 [^ \t\r\n\f\v]
\d 10進数字 [0-9]
\D 非10進数字 [^0-9]
\h 16進数字 [0-9a-fA-F]
\H 非16進数字 [^0-9a-fA-F]
これらの「空白」「数字」などは ASCII の範囲の文字のみを対象としています。 いわゆる「全角アルファベット」「全角空白」「全角数字」などは ここの空白、数字、には含まれません。
/\w+/.match("ABCdef") # => nil
/\W+/.match("ABCdef") # => #< MatchData "ABCdef">
/\s+/.match(" ") # => nil
/\S+/.match(" ") # => #< MatchData " ">
これらは文字クラス内で演算することもできます。
r = /[\d&&[^47]]/ # 4, 7 以外の数字
r.match("3") # => #< MatchData "3">
r.match("7") # => nil
Unicode プロパティによる文字クラス指定
また、Unicodeのプロパティ(属性情報)による文字クラス指定も可能です。 以下の記法が使えます。
\p{property-name}
\p{^property-name} (否定)
\P{property-name} (否定)
サポートされているプロパティのリストは https://github.com/k-takata/Onigmo/blob/master/doc/UnicodeProps.txt を 参考にしてください。また、プロパティの意味は Unicode の仕様を参照してください。
/\p{Letter}+/.match(".|あaABc123") # => #< MatchData "あaABc">
POSIX 文字クラス
Unicodeプロパティと 似た機能を持つ記法として、POSIX 文字クラスと呼ばれるものがあります。 これらは上の省略記法とは異なり、文字クラスの中でしか用いることが できません。これらは [:クラス名:] という記法を持ちます。 また、[:^クラス名:]という記法でその否定を意味します。 以下の括弧では実際にどの文字にマッチするかが Unicode プロパティや Unicode コードポイントで示されています。
[:alnum:] 英数字 (Letter | Mark | Decimal_Number)
[:alpha:] 英字 (Letter | Mark)
[:ascii:] ASCIIに含まれる文字 (0000 - 007F)
[:blank:] スペースとタブ (Space_Separator | 0009)
[:cntrl:] 制御文字 (Control | Format | Unassigned | Private_Use | Surrogate)
[:digit:] 数字 (Decimal_Number)
[:graph:] 空白以外の表示可能な文字(つまり空白文字、制御文字、以外) ([[:^space:]] && ^Control && ^Unassigned && ^Surrogate)
[:lower:] 小文字 (Lowercase_Letter)
[:print:] 表示可能な文字(空白を含む) ([[:graph:]] | Space_Separator)
[:punct:] 句読点 (Connector_Punctuation | Dash_Punctuation | Close_Punctuation | Final_Punctuation | Initial_Punctuation | Other_Punctuation | Open_Punctuation)
[:space:] 空白、改行、復帰 (Space_Separator | Line_Separator | Paragraph_Separator | 0009 | 000A | 000B | 000C | 000D | 0085)
[:upper:] 大文字 (Uppercase_Letter)
[:xdigit:] 16進表記で使える文字 (0030 - 0039 | 0041 - 0046 | 0061 - 0066)
[:word:] 単語構成文字 (Letter | Mark | Decimal_Number | Connector_Punctuation)
これらの POSIX 文字クラスは \s といった省略記法と異なり、 ASCIIコード範囲外の空白などを考慮に入れます。
/[[:alnum:]]+/.match("abAB121") # => #< MatchData "abAB121">
#\u3000 は全角空白
/[[:graph:]]/.match("\u3000") # => nil
/[[:blank:]]/.match("\u3000") # => #
/[[:alnum:]&&[:^lower:]]/.match("aA") # => #< MatchData "A">
/[[:print:]&&[:^lower:]]/.match(" ") # => #< MatchData " ">
注: POSIX ではここで言う文字クラスのことを「ブラケット表現」と 呼び、[:xxx:] というのを文字クラス、と呼んでいます。よって、 POSIX文字クラス、というのは厳密には 「POSIXブラケット表現における文字クラス」と呼ぶべきものですが、 ここでは「POSIX文字クラス」と呼ぶことにします。
注: [:word:] と [:ascii:] は POSIX では定義されていません。 Ruby/Oniguruma/Onigmo独自のものです。
注: エンコーディングによってこれらの POSIX 文字クラスの挙動が 異なります。上に書いている「マッチする文字」は Unicode 系統の エンコーディングで使われるものです。 Unicode 系統以外のものは Onigmo の ドキュメントを参照してください。
オプション
文字クラスの挙動は オプション で変更することができます。 d, a, u の3つのオプションがあります。