我有一个字符串,其中包含一堆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"] ]
每个文档末尾都有尾随的换行符。似乎只从文档中删除了一个换行符,但其他人留在了该位置。
如何更改上述正则表达式以从结果文档中删除所有尾随字符?
答案 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>"]]