Ruby 1.9 では、名前付きグループを使用して:
default_lang=:ruby
def coderay(text)
text.gsub(%r!<pre><code>(?::{3}(?<lang>\w+)\s+)?(?<code>.+?)</code></pre>!m) do
if $~[:lang].nil?
lang=default_lang
else
lang = $~[:lang].intern
end
CodeRay.scan($~[:code], lang).div()
end
end
default_lang
のコンテキストに応じて、ローカル変数ではなくクラス変数またはオブジェクト変数になることもありますcoderay
。
同じですが、インライン式を使用してオプションの言語を処理します。
default_lang=:ruby
def coderay(text)
text.gsub(%r!<pre><code>(?::{3}(?<lang>\w+)\s+)?(?<code>.+?)</code></pre>!m) do
CodeRay.scan($~[:code], $~[:lang].nil? ? default_lang : $~[:lang].intern).div()
end
end
2 番目のオプションは少し面倒なので、避けたほうがよいでしょう。
一致しないオプション グループ内の名前付きグループは、Ruby では引き続きカウントされるため、最初に考えたのとは異なり、一致しない番号付きグループの処理は、一致しない名前付きグループと何ら変わりはありません。したがって、上記の名前付きグループ参照を位置参照に置き換えることができ、同じように機能するはずです。
default_lang=:ruby
def coderay(text)
text.gsub(%r!<pre><code>(?::{3}(?<lang>\w+)\s+)?(?<code>.+?)</code></pre>!m) do
CodeRay.scan($2, $1.nil? ? default_lang : $1.intern).div()
end
end
def coderay(text)
text.gsub(%r!<pre><code>(?::{3}(?<lang>\w+)\s+)?(?<code>.+?)</code></pre>!m) do
if $1.nil?
lang=default_lang
else
lang = $1.intern
end
CodeRay.scan($2, lang).div()
end
end