#range #transform #replace

every-range

迭代器,用于交错包含和排除的区间

1 个不稳定版本

0.1.0 2020年3月3日

#1373文本处理

MIT 许可证

19KB
198

every-range

Build Status Latest Version Docs License

此 crate 实现了 Iterator 的扩展,该扩展在具有 ItemRange<usize> 的任何 Iterator 上具有 every_range 方法。

EveryRangeIter 遍历 Range 并“填充”缺失的区间,即两个连续区间之间的差距。原始区间和生成的区间可以通过 IncludedExcluded 枚举变体区分。

EveryRangeIter 在遍历的区间与后来用于替换字符串中部分子字符串的子字符串相关时非常有用。

用法

将其添加到您的 Cargo.toml

[dependencies]
every-range = "0.1"

版本

发布说明可在仓库中的 CHANGELOG.md 中找到。

示例:它是如何工作的?

use every_range::EveryRange;

// Lets use text as an example, but it could be anything
let text = "Foo rust-lang.org Bar
Baz crates.io Qux";

// Get some ranges from somewhere
let ranges = vec![
    4..17,  // "rust-lang.org"
    26..35, // "crates.io"
];

// `text.len()` tells `EveryRange` the end, so it knows
// whether to produce an extra range after or not
let iter = ranges.into_iter().every_range(text.len());

// The input `ranges` result in `Included` every other range is `Excluded`
for (kind, range) in iter {
    println!("{:?} {:>2?} - {:?}", kind, range.clone(), &text[range]);
}

这将输出以下内容

Excluded  0.. 4 - "Foo "
Included  4..17 - "rust-lang.org"
Excluded 17..26 - " Bar\nBaz "
Included 26..35 - "crates.io"
Excluded 35..39 - " Qux"

使用 every_range 可以轻松地将范围或子字符串收集到 String

use std::borrow::Cow;
use every_range::{EveryRange, EveryRangeKind};

let text = "Foo rust-lang.org Bar
Baz crates.io Qux";

// For URLs input ranges could be produced by linkify
let ranges = vec![
    4..17,  // "rust-lang.org"
    26..35, // "crates.io"
];

let output = ranges
    .into_iter()
    .every_range(text.len())
    .map(|(kind, range)| {
        if kind == EveryRangeKind::Included {
            let url = &text[range];
            format!("<a href=\"{0}\">{0}</a>", url).into()
        } else {
            Cow::Borrowed(&text[range])
        }
    })
    .collect::<Vec<_>>()
    .concat();

println!("{}", output);

这将输出以下内容

Foo <a href="rust-lang.org">rust-lang.org</a> Bar
Baz <a href="crates.io">crates.io</a> Qux

无运行时依赖