В Ruby 1.9 с использованием именованных групп:
default_lang=:ruby
def coderay(text)
text.gsub(%r!<pre><code>(?::{3}(?<lang>\w+)\s+)?(?<code>.+?)
! M) делать, если $ ~ [: 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>.+?)
! 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>.+?)
! M) do CodeRay.scan ($ 2, $ 1.nil?? Default_lang: $ 1.intern) .div() end end def coderay (text) text.gsub (% r!
(?::{3}(?<lang>\w+)\s+)?(?<code>.+?)
! m) делать, если $ 1.nil?lang = default_lang else lang = $ 1.intern end CodeRay.scan ($ 2, lang) .div () end end