在 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
第二种选择有点混乱,因此您可能希望避免使用它。
事实证明,不匹配的可选组中的命名组仍然计入 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