在Ruby的'String#scan'中使用正则表达式删除尾随换行符

时间:2017-08-06 06:19:58

标签: ruby regex

我有一个字符串,其中包含一堆HTML文档,标有@name

string = "@one\n\n<html>\n</html>\n\n@two\n<html>\n</html>\n\n\n"

我想得到一个两元素数组的数组,每个数组都有一个标记作为第一个元素,HTML文档作为第二个元素:

[ ["@one", "<html>\n</html>"], ["@two", "<html>\n</html>"] ]

为了解决这个问题,我精心设计了以下正则表达式:

regex = /(@.+)\n+([^@]+)\n+/

并将其应用于string.scan regex

但是,我得到以下内容,而不是所需的输出:

[ ["@one", "<html>\n</html>\n"], ["@two", "<html>\n</html>\n\n"] ]

每个文档末尾都有尾随的换行符。似乎只从文档中删除了一个换行符,但其他人留在了该位置。

如何更改上述正则表达式以从结果文档中删除所有尾随字符?

2 个答案:

答案 0 :(得分:0)

仅丢弃最后一个\n的原因是因为正则表达式中的两个相关捕获部分:.+[^@]+捕获到最后\n的所有内容(为了使匹配成为可能)。它们跟随\n+并不重要。请记住,正则表达式从左到右。如果某个子字符串(在这种情况下为\n的序列)可以适用于正则表达式的后续部分的前一部分,则它实际上适合前一部分。

一般情况下,我建议这样做:

string.split(/\s+(?=@)/).map{|s| s.strip.split(/\s+/, 2)}
# => [["@one", "<html>\n</html>"], ["@two", "<html>\n</html>"]]

答案 1 :(得分:0)

您可以先删除重复的换行符:

string.gsub(/\n+/, "\n").scan(regex)

=> [["@one", "<html>\n</html>"], ["@two", "<html>\n</html>"]]