3

我正在使用 Ruby 并寻找一种方法来读取包含以下文本的示例字符串:

"This is a test
file, dog cat bark
meow woof woof"

并将元素拆分为基于空格的字符数组,但将\n数组中的值保留为单独的元素。

我知道我可以用string.split(/\n/)得到

["this is a test", "file, dog cat bark", "meow woof woof"]

string.split(/ /)产生

["this", "is", "a", "test\nfile,", "dog", "cat", "bark\nmeow", "woof", "woof"]

但我正在寻找一种方法来获得:

["this", "is", "a", "test", "\n", "file,", "dog", "cat", "bark", "\n", "meow", "woof", "woof"]

有没有办法使用 Ruby 来完成这个任务?

4

4 回答 4

5

这是一件奇怪的事情,但是:

string.split /(?=\n)|(?<=\n)| /
#=> ["This", "is", "a", "test", "\n", "file,", "dog", "cat", "bark", "\n", "meow", "woof", "woof"]
于 2013-04-12T01:13:06.703 回答
5

你可以稍微改变你的逻辑,寻找你想要的东西,而不是寻找你想要的东西之间的分隔符。scan像这样的简单应该可以解决问题:

>> s.scan(/\S+|\n+/)
=> ["This", "is", "a", "test", "\n", "file,", "dog", "cat", "bark", "\n", "meow", "woof", "woof"]

这假设重复\n当然应该是一个单一的标记。

于 2013-04-12T01:30:50.323 回答
2

这不是特别优雅,但您可以尝试替换"\n"" \n "(注意周围的空格\n),然后将生成的字符串拆分为/ /.

于 2013-04-12T00:58:12.320 回答
1

这是一个奇怪的要求,也许,如果您告诉我们您为什么要这样做,我们可以帮助您以更直接和传统的方式进行。

看起来您正在尝试拆分单词并且仍然知道原始行尾在哪里。将行拆分成单个单词对很多事情都很有用,但保持行尾……根据我的经验,这不是很多。

当我处理文本并需要拆分行进行处理时,我会这样做:

text = "This is a test
file, dog cat bark
meow woof woof"

data = text.lines.map(&:split)

此时,data看起来像:

[["This", "is", "a", "test"],
 ["file,", "dog", "cat", "bark"],
 ["meow", "woof", "woof"]]

我知道每个子数组是一个单独的行,所以如果我需要按行处理,我可以使用类似eachor的迭代器来完成map,或者重建原始文本,我可以join(" ")使用子数组元素,然后join("\n")生成的行:

data.map{ |a| a.join(' ') }.join("\n")
=> "This is a test\nfile, dog cat bark\nmeow woof woof"
于 2013-04-12T01:48:55.743 回答