我正在使用CodeRay进行语法突出显示,但我遇到了这个正则表达式的问题。文本如下所示:
<pre><code>:::ruby
def say_hello
puts 'hello!'
end
</code></pre>
这一部分::::ruby
将告诉CodeRay代码块应该被解释为哪种语言(但它必须是可选的)。所以这就是我到目前为止所做的:
def coderay(text)
text.gsub(/\<pre\>\<code\>(.+?)\<\/code\>\<\/pre\>/m) do
CodeRay.scan($2, $3).div()
end
end
$2
包含我正在格式化的代码(包括说明格式化的语言的行),但我需要提取第一行,以便将其作为第二个参数传递给{{ 1}}或者如果找不到该语言行则传递默认参数。我怎么能这样做?
答案 0 :(得分:1)
在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
第二个选项有点麻烦,因此你might want to avoid it。
事实证明,不匹配的可选组中的命名组仍然在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