| Crates.io | fnmatch-regex2 |
| lib.rs | fnmatch-regex2 |
| version | 0.4.0 |
| created_at | 2023-12-21 13:15:34.935088+00 |
| updated_at | 2025-06-14 21:44:12.314635+00 |
| description | Convert a glob-style pattern to a regular expression. |
| homepage | |
| repository | https://gitlab.com/brmmm3/fnmatch-regex2-rs |
| max_upload_size | |
| id | 1076902 |
| size | 47,687 |
[Home | GitLab | crates.io | ReadTheDocs]
This crate currently provides a single function, glob_to_regex, that
converts a glob-style pattern with some shell extensions to a regular
expression. Note that it only handles text pattern matching, there are
no attempts to verify or construct any filesystem paths.
The glob-style pattern features currently supported are:
any character except ?, *, [, \, or { is matched literally
? matches any single character except a slash (/)
* matches any sequence of zero or more characters that does not
contain a slash (/)
a backslash allows the next character to be matched literally, except
for the \a, \b, \e, \n, \r, and \v sequences
a [...] character class supports ranges, negation if the very first
character is !, backslash-escaping, and also matching
a ] character if it is the very first character possibly after
the ! one (e.g. []] would only match a single ] character)
an {a,bbb,cc} alternation supports backslash-escaping, but not
nested alternations or character classes yet
Note that the * and ? wildcard patterns, as well as the character
classes, will never match a slash.
abc.txt would only match abc.txt
foo/test?.txt would match e.g. foo/test1.txt or foo/test".txt,
but not foo/test/.txt
/etc/c[--9].conf would match e.g. /etc/c-.conf, /etc/c..conf,
or /etc/7.conf, but not /etc/c/.conf
linux-[0-9]*-{generic,aws} would match linux-5.2.27b1-generic
and linux-4.0.12-aws, but not linux-unsigned-5.2.27b1-generic
Note that the negation modifier for character classes is !, not ^.
let re_name = fnmatch_regex::glob_to_regex("linux-[0-9]*-{generic,aws}")?;
for name in &[
"linux-5.2.27b1-generic",
"linux-4.0.12-aws",
"linux-unsigned-5.2.27b1-generic"
] {
let okay = re_name.is_match(name);
println!(
"{}: {}",
name,
match okay { true => "yes", false => "no" },
);
assert!(okay == !name.contains("unsigned"));
}
The fnmatch-regex library was written by Peter Pentchev.
It is developed in a GitLab repository. This documentation is
hosted at Ringlet with a copy at ReadTheDocs.