使用空格分割字符串同时保留 \n 作为单独的元素

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个回答

5

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

string.split /(?=\n)|(?<=\n)| /
#=> ["This", "is", "a", "test", "\n", "file,", "dog", "cat", "bark", "\n", "meow", "woof", "woof"]

5

你可以略微调整你的思路,寻找你想要的内容而不是寻找你想要内容之间的定界符。一个简单的类似于这样的scan方法应该能够解决问题:

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

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


+1 我喜欢这个,更喜欢寻找所需的内容。当人们使用 gsub 删除不需要的内容而不是匹配所需内容时,这听起来像是我在工作中的口头禅。 - the Tin Man
还不错,但这样做无法按连续分隔符切割字符串,可能需要做一些改进。 - pguardiario
@pguardiario:不太确定你的意思,你有例子吗?像是 "a\n \nb" 这样的东西吗? - mu is too short
@pguardiario: "这假设重复的\n应该是一个单独的标记。" 切换到 /\S+/\n/ 可以解决你的情况,而 /\S+|(?:\n\s*)/ 则可以解决我的 "a\n \nb" 情况。 - mu is too short
@pguardiario:下次我们见面得比个臂力才行 :) 擀面杖对草莓/奇异果派,应该很有趣。 - mu is too short
显示剩余2条评论

2

这并不是特别优雅的方法,但你可以尝试用" \n "(注意\n周围的空格)替换"\n",然后在/ /处将结果字符串分割。


好问题!想知道 "\n"" \n " 之间的区别。你能解释一下吗? - Arup Rakshit
@RubyLovely 在 string.split(/\s/) 操作中,\n 两侧的空格会被“消耗”,导致 \n 与任何不是空格的连续字符字符串一起放置在结果数组中。另外,我需要更正我的答案为 / / 而不是 /\s/,因为 /\s/ 还包括 \n 和其他一些空白字符。 - jongo45
+1 这个链接是关于如何确保多个变量具有不同值的问题。 - Arup Rakshit

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"]]

我知道每个子数组都是一个单独的行,因此如果需要按行处理,可以使用类似eachmap的迭代器,或者重新构建原始文本,可以将子数组元素join(" "),然后join("\n")得到结果行:

data.map{ |a| a.join(' ') }.join("\n")
=> "This is a test\nfile, dog cat bark\nmeow woof woof"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接