| English | 简体中文 |
A high-performance Rust crate for multi-pattern string matching, validation, filtering, and replacement.
find_allMatch): find_first_matchvalidatefilterreplacerayon support (parallel feature, enabled by default)find_all_batchfind_all_layeredfind_all_streamingThe engine auto-selects based on vocabulary size:
| Patterns | Algorithm | Rationale |
|---|---|---|
| 0–100 | Wu-Manber | Small tables, quick scan |
| 101–10,000 | Aho-Corasick | O(n) automaton scan regardless of count |
| 10,000+ | Regex | Compilation overhead amortized |
Override with Filter::with_algorithm(...) or --algorithm on the CLI.
| Platform | Status | How |
|---|---|---|
| Linux / macOS / Windows | Full support | default features / --all-features |
| WASM (browser / Node.js) | Supported | wasm feature; no file/network I/O (use loadWords) |
Embedded (no_std) |
Experimental | --no-default-features; core exact matching only |
| Async (tokio) | Supported | async-io / net-async features |
[dependencies]
sensitive-rs = { version = "1.3", default-features = false, features = ["wasm"] }
import init, { WasmFilter } from 'sensitive-rs';
await init();
const filter = new WasmFilter();
filter.addWord('赌博');
filter.findAll('含有赌博内容'); // ['赌博']
filter.loadWords('色情\n诈骗'); // bulk-load from in-memory text
no_std (embedded)[dependencies]
sensitive-rs = { version = "1.3", default-features = false }
Core find_all / find_in / replace / filter work without std. Pinyin/shape variant
detection, the LRU cache, and the file/network loaders require the std feature (on by default).
[dependencies]
sensitive-rs = { version = "1.3", features = ["async-io"] }
#[tokio::main]
async fn main() -> std::io::Result<()> {
use sensitive_rs::Filter;
let mut filter = Filter::new();
filter.load_word_dict_async("dict/dict.txt").await?;
Ok(())
}
Add to your Cargo.toml:
[dependencies]
sensitive-rs = "1.3.0"
For environments that should avoid rayon (for example WASM or embedded targets), disable default features:
[dependencies]
sensitive-rs = { version = "1.3.0", default-features = false }
use sensitive_rs::Filter;
fn main() {
let mut filter = Filter::new();
filter.add_words(&["rust", "filter", "敏感词"]);
let text = "hello rust, this is a filter demo 包含敏感词";
let found = filter.find_all(text);
println!("Found: {:?}", found);
let cleaned = filter.replace(text, '*');
println!("Cleaned: {}", cleaned);
}
Batch processing:
let texts = vec!["text1", "text2"];
let results = filter.find_all_batch(&texts);
Layered matching:
let layered = filter.find_all_layered("some long text");
Streaming large files:
use std::fs::File;
use std::io::BufReader;
let reader = BufReader::new(File::open("large.txt")?);
let stream_results = filter.find_all_streaming(reader)?;
Install with the cli feature:
[dependencies]
sensitive-rs = { version = "1.3.0", features = ["cli"] }
Or install directly:
cargo install sensitive-rs --features cli
Both sensitive and sensitive-rs commands are available after installation.
# Find sensitive words
sensitive check "含有赌博和色情内容"
# Validate (exit 1 if sensitive words found)
sensitive validate "clean text"
# Replace sensitive words
sensitive replace '*' "含有赌博内容"
# Remove sensitive words
sensitive filter "含有赌博内容"
# Read from file
sensitive check --file input.txt
# Pipe from stdin
echo "text" | sensitive check
--dict <path> — custom dictionary file--dict-all — use extended dictionary (27k words)--algorithm <algo> — force algorithm: aho-corasick, wumanber, regex--variant — enable pinyin and shape variant detection--noise-pattern <regex> — custom noise removal regex--json — JSON output format--color — force colored outputcargo run --example basic
cargo run --example batch
cargo run --example custom_dict
cargo run --example variant
cargo bench
For detailed documentation, please refer to Documentation.
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 or MIT license, shall be dual licensed as above, without any additional terms or conditions.