CoffeeScriptにおける正規表現
Block Regular Expression
Rubyでは文字列と同じく,正規表現リテラル内でも変数展開が可能である.
`/#{hoge}Script/`
ではRubyと同様の文字列リテラルでの変数展開を利用できるCoffeeScriptだとどうか?
# これは死
# /#{hoge}Script/
# これならOK
///#{hoge}Script///
この3重スラッシュはBlock Regular Expressionsという名前らしい.
extended regular expressions that ignore internal whitespace and can contain comments and interpolation
///#{hoge}Script/// # =>`RegExp(hoge + "Script");` に変換される
Perlのxオプションのように改行とか空白,コメントも自由に入れられる(空白を無視してほしくない時はエスケープする: \
).
Modeled after Perl's /x modifier
# 変換前
OPERATOR = /// ^ (
?: [-=]> # function
| [-+*/%<>&|^!?=]= # compound assign / compare
| >>>=? # zero-fill right shift
| ([-+:])\1 # doubles
| ([&|<>])\2=? # logic / shift
| \?\. # soak access
| \.{2,3} # range or splat
) ///
# 変換後
# var OPERATOR;
#
# OPERATOR = /^(?:[-=]>|[-+*\/%<>&|^!?=]=|>>>=?|([-+:])\1|([&|<>])\2=?|\?\.|\.{2,3})/;
便利.
text = 'Java'
msg = 'JavaScriptTypeScriptCoffeeScriptTypeScriptJavaScriptCoffeeScript'
pattern = ///#{text}Script///g
msg.replace(pattern, 'TypeScript')
# => TypeScriptTypeScriptCoffeeScriptTypeScriptTypeScriptCoffeeScript
TypeScript最高(╹◡╹)