式展開を用いる場合、スラッシュはエスケープしなくてもよい
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">