コンテンツへスキップ

正規表現

正規表現は、Regexクラスで表されます。

Regexは通常、PCRE2構文を使用して正規表現リテラルで作成されます。これは、スラッシュ(/)で囲まれたUTF-8文字の文字列で構成されます。

/foo|bar/
/h(e+)llo/
/\d+/
/あ/

注記

Crystal 1.8より前は、コンパイラは正規表現リテラルが元のPCREパターン構文に従うことを期待していました。新しいPCRE2パターン構文1.8で導入されました。

エスケープ

正規表現は、文字列リテラルと同じエスケープシーケンスをサポートします。

/\//         # slash
/\\/         # backslash
/\b/         # backspace
/\e/         # escape
/\f/         # form feed
/\n/         # newline
/\r/         # carriage return
/\t/         # tab
/\v/         # vertical tab
/\NNN/       # octal ASCII character
/\xNN/       # hexadecimal ASCII character
/\x{FFFF}/   # hexadecimal unicode character
/\x{10FFFF}/ # hexadecimal unicode character

区切り文字/は、スラッシュで区切られた正規表現リテラル内ではエスケープする必要があります。PCRE構文の特殊文字は、リテラル文字として使用する場合はエスケープする必要があることに注意してください。

補間

補間は、文字列リテラルと同様に、正規表現リテラルでも機能します。この機能を使用すると、結果の文字列が不正な正規表現になる場合、実行時に例外が発生することに注意してください。

修飾子

終了区切り文字の後に、正規表現の一致動作を調整するためのいくつかのオプションの修飾子を付けることができます。

  • i:大文字と小文字を区別しないマッチング(PCRE_CASELESS):パターンのUnicode文字は大文字と小文字の両方の文字と一致。
  • m:複数行マッチング(PCRE_MULTILINE):行頭(^)と行末($)のメタ文字は、それぞれ、対象文字列内の内部改行の直後または直前に一致し、また先頭と末尾にも一致します。
  • x:拡張ホワイトスペースマッチング(PCRE_EXTENDED):パターン内のほとんどの空白文字は、無視するか文字クラス内にある場合を除いて、完全に無視されます。エスケープされていないハッシュ文字#は、行末まで続くコメントの開始を示します。
/foo/i.match("FOO")         # => #<Regex::MatchData "FOO">
/foo/m.match("bar\nfoo")    # => #<Regex::MatchData "foo">
/foo /x.match("foo")        # => #<Regex::MatchData "foo">
/foo /imx.match("bar\nFOO") # => #<Regex::MatchData "FOO">

パーセント正規表現リテラル

スラッシュで区切られたリテラルに加えて、正規表現は%rと一対の区切り文字で示されるパーセントリテラルとして表現することもできます。有効な区切り文字は、括弧()、角括弧[]、波括弧{}、山括弧<>、パイプ||です。パイプを除いて、すべての区切り文字は入れ子にすることができます。つまり、リテラル内の開始区切り文字は、次の終了区切り文字をエスケープします。

これらは、スラッシュで区切られたリテラルではエスケープする必要があるスラッシュを含む正規表現を書くのに便利です。

%r((/)) # => /(\/)/
%r[[/]] # => /[\/]/
%r{{/}} # => /{\/}/
%r<</>> # => /<\/>/
%r|/|   # => /\//