6个版本
0.1.5 | 2023年6月12日 |
---|---|
0.1.4 | 2023年6月12日 |
0.1.3 | 2021年8月25日 |
0.1.2 | 2020年2月21日 |
在 文本处理 中排名第141
每月下载量3,530次
用于 22 个crates (7 直接)
39KB
369 行
line-span
这个crate提供从字节索引查找行的开始、结束和范围的实用程序。进一步,还可以从任意字节索引找到下一行和上一行。
这通过 trait LineSpanExt
实现,该trait针对 str
实现,并提供了以下方法
使用方法
将此添加到您的 Cargo.toml
[dependencies]
line-span = "0.1"
版本
版本说明可在仓库中的 CHANGELOG.md 文件中找到。
当前行
find_line_start()
查找当前行的开始。find_line_end()
查找当前行的结束。find_line_range()
查找当前行的开始和结束。
下一行
find_next_line_start()
查找下一行的开始。find_next_line_end()
查找下一行的结束。find_next_line_range()
查找下一行的开始和结束。
上一行
find_prev_line_start()
查找上一行的开始。find_prev_line_end()
用于找到上一行的末尾。find_prev_line_range()
用于找到上一行的起始和结束。
实用工具
str_to_range()
获取字符串中子字符串的范围。str_to_range_unchecked()
是str_to_range()
的非检查版本。
LineSpan
和 LineSpanIter
该包包含 LineSpanIter
迭代器。它在功能上等同于 str::lines()
,增加了获取每行起始和结束字节索引的能力。此外,它还包括获取包括和排除行结束符(\n
或 \r\n
)的能力。
可以通过调用 line_spans()
创建一个 LineSpanIter
,该方法是 LineSpans
特性实现的。该包为 str
和 String
实现了 LineSpans
特性。
注意,LineSpan
实现了 Deref
到 &str
,因此通常交换 lines()
到 line_spans()
不会引起很多问题。
use line_span::LineSpans;
let text = "foo\nbar\r\nbaz";
for span in text.line_spans() {
println!(
"{:>2?}: {:?} {:?} {:?}",
span.range(),
span.as_str(),
span.as_str_with_ending(),
span.ending_str(),
);
}
这将输出以下内容
(手动对齐以增强可读性)
0.. 3: "foo" "foo\n" "\n"
4.. 7: "bar" "bar\r\n" "\r\n"
9..12: "baz" "baz" ""
当前行,上一行和下一行
use line_span::LineSpanExt;
let text = "foo\nbar\r\nbaz";
// ^
let i = 5; // 'a' in "bar"
let curr_range = text.find_line_range(i);
let next_range = text.find_next_line_range(i).unwrap();
let prev_range = text.find_prev_line_range(i).unwrap();
assert_eq!(curr_range, 4..7);
assert_eq!(&text[curr_range], "bar");
assert_eq!(prev_range, 0..3);
assert_eq!(&text[prev_range], "foo");
assert_eq!(next_range, 9..12);
assert_eq!(&text[next_range], "baz");
字符串中子字符串的范围
使用 str_to_range
(或 str_to_range_unchecked
)来获取字符串中子字符串的范围。
let string1 = "Foo Bar Baz";
let string2 = "Hello World";
let substring = &string1[4..7]; // "Bar"
// Returns `Some` as `substring` is a part of `string1`
assert_eq!(str_to_range(string1, substring), Some(4..7));
// Returns `None` as `substring` is not a part of `string2`
assert_eq!(str_to_range(string2, substring), None);