1 个不稳定版本
0.1.0 | 2020年3月3日 |
---|
#1373 在 文本处理
19KB
198 行
every-range
此 crate 实现了 Iterator
的扩展,该扩展在具有 Item
为 Range<usize>
的任何 Iterator
上具有 every_range
方法。
EveryRangeIter
遍历 Range
并“填充”缺失的区间,即两个连续区间之间的差距。原始区间和生成的区间可以通过 Included
和 Excluded
枚举变体区分。
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"
示例:“自动链接”或 HTML 化 URL
使用 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