如何在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?)+)