【ruby】正規表現パターン文字列を式展開して作る際のスラッシュ(/)の取り扱いについて

Ruby

式展開を用いる場合、スラッシュはエスケープしなくてもよい

number = “(\\d+)”

operator = “(\\+|-|\\*|/)”

/#{number}#{operator}#{number}/.match(“43+291”)

# => #<MatchData “43+291″ 1:”43″ 2:”+” 3:”291″>

https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html

のような記述で式展開して正規表現パターン文字列を生成することができる。

式展開を用いない場合、スラッシュはエスケープしなければならない

上記の内容を式展開を用いずに再現する場合、下記ように途中のスラッシュ(/)をエスケープする必要がある。

/(\d+)(\+|-|\*|\/)(\d+)/.match("43+291")
=> #<MatchData "43+291" 1:"43" 2:"+" 3:"291">

そうしないと↓のようにエラーになる

/(\d+)(\+|-|\*|/)(\d+)/.match("43+291")
(eval):2: end pattern with unmatched parenthesis: /(\d+)(\+|-|\*|/
SyntaxError: unexpected ')', expecting end-of-input
/(\d+)(\+|-|\*|/)(\d+)/.match("43+291")

式展開する場合は、スラッシュのエスケープは不要なのか?
+とか他のメタ文字はエスケープしているようだが。。。
下記のように変数operatorに入れる値にスラッシュをエスケープ形にしても、それはそれで動いているように見える

number = "(\\d+)"
operator = "(\\+|-|\\*|\\/)"
/#{number}#{operator}#{number}/.match("43+291")
=> #<MatchData "43+291" 1:"43" 2:"+" 3:"291">

変数から式展開する際に、変数の中にスラッシュがあったら自動でエスケープしてくれるっぽい
上記の内容のmatchの引数にスラッシュを入れてみたのが下記だが、うまく動いている

number = "(\\d+)"
operator = "(\\+|-|\\*|\\/)"
/#{number}#{operator}#{number}/.match("43/291")
=> #<MatchData "43/291" 1:"43" 2:"/" 3:"291">

タイトルとURLをコピーしました