Ruby 4.0 リファレンスマニュアル

singleton method Regexp.union

union(*pattern) -> Regexp[permalink][rdoc][edit]
(*Regexp | _ToRegexp | string patterns) → Regexp
(array[Regexp | _ToRegexp | string] patterns) → Regexp
(Symbol | [ Symbol ] symbol_pattern) → Regexp

引数として与えた pattern を選択 | で連結し、正規表現オブジェクトとして返します。返り値は与えた pattern のどれかにマッチする場合にマッチするものになります。

p Regexp.union(/a/, /b/, /c/) # => /(?-mix:a)|(?-mix:b)|(?-mix:c)/

引数を一つだけ与える場合は、Array を与えても正規表現オブジェクトを生成します。つまり、以下のように書くことができます。

arr = [/a/, /b/, /c/]
p Regexp.union(arr)  # => /(?-mix:a)|(?-mix:b)|(?-mix:c)/
# Ruby 1.8.7 より前は、以下のように書く必要があった
p Regexp.union(*arr) # => /(?-mix:a)|(?-mix:b)|(?-mix:c)/

patternRegexp または String で与えます。 String で与えた場合、それ自身と等しい文字列にマッチするものと解釈され、エスケープされて結果の正規表現オブジェクトに組み込まれます。

p Regexp.union("a", "?", "b") # => /a|\?|b/
p Regexp.union(/a/, "*") # => /(?-mix:a)|\*/

引数をひとつも与えなかった場合、決してマッチしない正規表現オブジェクトを返します。

p Regexp.union() # => /(?!)/

返り値が対応する文字コードは引数として与えた正規表現オブジェクトが扱う文字コードに一致します。固定コードに対してコンパイルされている正規表現オブジェクトを複数与える場合、それらのコードは一致していなければなりません。異なる固定コードに対してコンパイルされている正規表現オブジェクトが存在する場合、ArgumentError が発生します。

p Regexp.union(/a/e, /b/e) # => /(?-mix:a)|(?-mix:b)/e
Regexp.union(/a/e, /b/s)   # ~> ArgumentError

コードが固定されている正規表現オブジェクトとコードが固定されていない正規表現オブジェクトを混ぜた場合、返り値は固定されているコードに対応するものになります。

p Regexp.union(/a/e, /b/) # => /(?-mix:a)|(?-mix:b)/e
[PARAM] pattern:
| で連結したい正規表現を指定します
# オプションは合成されない
p Regexp.union(/foo/i, /bar/x, /hoge/m) # => /(?i-mx:foo)|(?x-mi:bar)|(?m-ix:hoge)/

# 文字列そのものにマッチする
rep1 = [ "foo", "bar", "hoge"]
p Regexp.union(*rep1) # => /foo|bar|hoge/
p Regexp.union(rep1)  # => /foo|bar|hoge/

# 下記の場合オプションがつくのは最初だけ
rep2 = [ /foo/x, "bar", "hoge"]
p Regexp.union(*rep2) # => /(?x-mi:foo)|bar|hoge/
p Regexp.union(rep2)  # => /(?x-mi:foo)|bar|hoge/