【发布时间】:2011-08-08 19:51:48
【问题描述】:
我在 Ruby 中有一个正则表达式在多行模式下无法正常工作。
我正在尝试将 Markdown 文本转换为 Redmine 中使用的 Textile-eque 标记。问题出在我用于转换代码块的正则表达式中。它应该找到任何以 4 个空格或制表符开头的行,然后将它们包装在 pre 标记中。
markdownText = '# header
some text that precedes code
var foo = 9;
var fn = function() {}
fn();
some post text'
puts markdownText.gsub!(/(^(?:\s{4}|\t).*?$)+/m,"<pre>\n\\1\n</pre>")
预期结果:
# header
some text that precedes code
<pre>
var foo = 9;
var fn = function() {}
fn();
</pre>
some post text
问题是结束 pre 标记打印在文档的末尾,而不是在“fn();”之后。我尝试了以下表达式的一些变体,但不匹配:
gsub!(/(^(?:\s{4}|\t).*?$)+^(\S)/m, "<pre>\n\\1\n</pre>\\2")
如何让正则表达式只匹配缩进的代码块?你可以在 Rubular here 上测试这个正则表达式。
【问题讨论】:
-
为什么不在你的正则表达式中包含换行符:
((?:\s{4}|\t).*?\n)+ -
@Mladen Jablanovic 我无法让您的示例使用此代码:
puts markdownText.gsub!(/((?:\s{4}|\t).*?\n)+/,"<pre>\n\\1\n</pre>")。\n与$的行为有何不同? -
这只是获取缩进部分的正则表达式(在 Rubular 中尝试过),而不是一个完整的工作 gsub-ready 解决方案(因此,只是一个评论)。