2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

正規表現 文字クラス

Last updated at Posted at 2019-11-24

文字クラス(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つのオプションがあります。

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?