如何在Ruby中修复此多行正则表达式?

我在Ruby中有一个正则表达式,它在多行模式下无法正常工作。

我正在尝试将Markdown文本转换为Redmine中使用的Textile-eque标记。 问题出在我的正则表达式中,用于转换代码块。 它应该找到带有4个空格或制表符的任何行,然后将它们包装在标签中。

markdownText = '# header some text that precedes code var foo = 9; var fn = function() {} fn(); some post text' puts markdownText.gsub!(/(^(?:\s{4}|\t).*?$)+/m,"
\n\\1\n

")

预期结果:

 # header some text that precedes code 
 var foo = 9; var fn = function() {} fn(); 

some post text

问题是关闭标记打印在文档的末尾而不是“fn();”之后。 我尝试了以下表达式的一些变体,但它不匹配:

 gsub!(/(^(?:\s{4}|\t).*?$)+^(\S)/m, "
\n\\1\n

\\2")

如何使正则表达式仅与缩进的代码块匹配? 你可以在这里测试Rubular上的这个正则表达式。

首先,请注意Ruby中的'm'多行模式等同于其他语言的's'单行模式。 换一种说法; Ruby中的'm'模式意味着: “点匹配所有”

这个正则表达式可以很好地匹配类似markdown的代码部分:

 re = / # Match a MARKDOWN CODE section. (\r?\n) # $1: CODE must be preceded by blank line ( # $2: CODE contents (?: # Group for multiple lines of code. (?:\r?\n)+ # Each line preceded by a newline, (?:[ ]{4}|\t).* # and begins with four spaces or tab. )+ # One or more CODE lines \r?\n # CODE folowed by blank line. ) # End $2: CODE contents (?=\r?\n) # CODE folowed by blank line. /x result = subject.gsub(re, '\1
\2

')

这需要代码部分之前和之后的空白行,并允许代码部分本身内的空行。 它允许\r\n\n行终止。 请注意,这不会删除每行前面的前4个空格(或制表符)。 这样做需要更多的代码复杂性。 (我不是一个ruby家伙,所以无法帮助。)

我建议查看降价源本身,看看它是如何完成的。

/^(\s{4}|\t)+.+\;\n$/m

工作得更好,仍然拿起我们不想要的换行。 这是在rubular上。

这对我的样本输入很有用。

 markdownText.gsub(/\n?((\s{4}.+)+)/, "\n
#{$1}\n

")

这是另一个捕获单个块中所有缩进行的

 ((?:^(?: {4}|\t)[^\n]*$\n?)+)