Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby:嵌套正则表达式和字符串替换_Ruby_Coderay - Fatal编程技术网

Ruby:嵌套正则表达式和字符串替换

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

我正在使用CodeRay进行语法高亮显示,但是这个正则表达式有问题。文本将如下所示:

<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