#line #text #streaming #line-end

无std line-span

查找行范围并在行之间跳转

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

Download history 490/week @ 2024-03-13 531/week @ 2024-03-20 476/week @ 2024-03-27 628/week @ 2024-04-03 678/week @ 2024-04-10 696/week @ 2024-04-17 746/week @ 2024-04-24 675/week @ 2024-05-01 477/week @ 2024-05-08 729/week @ 2024-05-15 556/week @ 2024-05-22 623/week @ 2024-05-29 707/week @ 2024-06-05 682/week @ 2024-06-12 1133/week @ 2024-06-19 860/week @ 2024-06-26

每月下载量3,530
用于 22 个crates (7 直接)

MIT 许可证

39KB
369

line-span

CI Latest Version Docs License

这个crate提供从字节索引查找行的开始、结束和范围的实用程序。进一步,还可以从任意字节索引找到下一行和上一行。

这通过 trait LineSpanExt 实现,该trait针对 str 实现,并提供了以下方法

使用方法

将此添加到您的 Cargo.toml

[dependencies]
line-span = "0.1"

版本

版本说明可在仓库中的 CHANGELOG.md 文件中找到。


当前行

下一行

上一行

实用工具

LineSpanLineSpanIter

该包包含 LineSpanIter 迭代器。它在功能上等同于 str::lines(),增加了获取每行起始和结束字节索引的能力。此外,它还包括获取包括和排除行结束符(\n\r\n)的能力。

可以通过调用 line_spans() 创建一个 LineSpanIter,该方法是 LineSpans 特性实现的。该包为 strString 实现了 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);

无运行时依赖

功能