Ruby:嵌套正则表达式和字符串替换
我正在使用CodeRay进行语法高亮显示,但是这个正则表达式有问题。文本将如下所示:Ruby:嵌套正则表达式和字符串替换,ruby,coderay,Ruby,Coderay,我正在使用CodeRay进行语法高亮显示,但是这个正则表达式有问题。文本将如下所示: <pre><code>:::ruby def say_hello puts 'hello!' end </code></pre> 这一部分:::ruby将告诉CodeRay应该将代码块解释为哪种语言(但它需要是可选的)。以下是我到目前为止的情况: default_lang=:ruby def coderay(text) text.gsub(%r!&l
<pre><code>:::ruby
def say_hello
puts 'hello!'
end
</code></pre>
这一部分:::ruby
将告诉CodeRay应该将代码块解释为哪种语言(但它需要是可选的)。以下是我到目前为止的情况:
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
def coderay(文本)
text.gsub(/\\(.+?)\\\/m)do
CodeRay.scan($2,$3).div()
结束
结束
$2
包含我正在格式化的代码(包括说明格式化语言的行),但我需要提取第一行,以便将其作为第二个参数传递给scan()
,或者如果找不到该语言行,则传递一个默认参数。如何做到这一点?在Ruby 1.9中,使用命名组:
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
!m) 做
如果$~[:lang].nil?
lang=默认值
其他的
lang=$~[:lang]。实习生
结束
CodeRay.scan($~[:code],lang).div()
结束
结束
default\u lang
也可以是类或对象变量,而不是局部变量,具体取决于coderay
的上下文
相同,但使用内联表达式处理可选语言:
!m) 做
CodeRay.scan($~[:code],$~[:lang].nil??默认值\u lang:$~[:lang].intern).div()
结束
结束
第二个选择是有点混乱,因此你
事实证明,非匹配可选组中的命名组仍然在Ruby中计数,因此,与我最初的想法不同,处理非匹配的编号组与处理非匹配的命名组没有任何区别。因此,您可以在上面用位置参照替换命名的组参照,其工作原理应该是相同的
!m) 做
CodeRay.scan($2,$1.nil)?默认值:$1.intern.div()
结束
结束
def coderay(文本)
text.gsub(%r!!m)do
如果1.0美元?
lang=默认值
其他的
朗=1.5美元实习生
结束
CodeRay.scan($2,lang).div()
结束
结束
您使用的是Ruby 1.8还是1.9。这有区别吗?Ruby 1.9中的REs支持命名组。另外,您只是想让Ruby成为默认语言,还是想用一种更复杂的方式来解释代码是什么语言?1.8语法是什么样的?
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
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