2016-11-07 14 views
3

文字列内の行を繰り返し処理する必要がありますが、最後に改行が残されます。改行文字を含む文字列の行を繰り返します。

ありstr.lines()ですが、それが返す文字列は、改行文字が切り落とさ持っている:

assert_eq!(lines("foo\nbar\n"), vec!["foo\n", "bar\n"]); 

もっとテストケース:

assert!(lines("").is_empty()); 
assert_eq!(lines("f"), vec!["f"]); 
assert_eq!(lines("foo"), vec!["foo"]); 
assert_eq!(lines("foo\n"), vec!["foo\n"]); 
assert_eq!(lines("foo\nbar"), vec!["foo\n", "bar"]); 
assert_eq!(lines("foo\r\nbar"), vec!["foo\r\n", "bar"]); 
assert_eq!(lines("foo\r\nbar\r\n"), vec!["foo\r\n", "bar\r\n"]); 
assert_eq!(lines("\nfoo"), vec!["\n", "foo"]); 
assert_eq!(lines("\n\n\n"), vec!["\n", "\n", "\n"]); 

ここ
let result: Vec<_> = "foo\nbar\n".lines().collect(); 
assert_eq!(result, vec!["foo", "bar"]); 

は、私は必要なものです私は基本的にループでfindを呼び出すソリューションを持っていますが、私はよりエレガントなものがあるのか​​疑問に思う。

この

Split a string keeping the separatorsに似ていますが、その場合には、文字が別々のアイテムとして返されますが、私は、文字列の一部としてそれらを維持したい:私は現在持っているソリューションは、このようになります

["hello\n", "world\n"]; // This 
["hello", "\n", "world", "\n"]; // Not this 

答えて

2

+0

代わりに 'slice :: split_at'を使用する場合、' start'パラメータは必要ありません。ループの各繰り返しで 'self.input'を更新できます。 –

+0

ありがとう@MatthieuM。、それがそれを簡単になります! – robinst

関連する問題