Expand description
This crate provides a Rust implementation of VerbalExpressions in order to build regex strings without knowing the minutiae of regex syntax.
It uses the Regex
crate to compile the created regex strings.
§Examples
A simple example to show the usage:
use verex::Verex;
use verex::find;
// You can either use a mutable Verex to define different regexes
let mut verex = Verex::new();
let regex1 = verex.find("a")
.compile()
.unwrap();
let regex2 = verex.or_find("b")
.compile()
.unwrap();
// Or just use it for building one (you can use the funcitons directly as constructors)
let regex3 = find("a") // or: Verex::new().find("a")
.or_find("b")
.compile()
.unwrap();
// Test whether the regexes match correctly
assert!(!regex1.is_match("b"));
assert!(regex2.is_match("b"));
assert!(regex3.is_match("b"));
// Test the generated regex strings
assert_eq!(regex1.as_str(), r"(?:(?:a))");
assert_eq!(regex2.as_str(), r"(?:(?:a)|(?:b))");
assert_eq!(regex3.as_str(), r"(?:(?:a)|(?:b))");
Here’s a URL testing example shamelessly stolen from the python Verex readme:
use verex::start_of_line;
// Create an example of how to test for correctly formed URLs
let verex = start_of_line()
.find("http")
.maybe("s")
.find("://")
.maybe("www.")
.anything_but(" ")
.end_of_line()
.clone();
let regex = verex.compile().unwrap();
// Create an example URL
let test_url = r"https://www.google.com";
// Test if the URL is valid
assert!(regex.is_match(test_url));
// Test the generated regex string
assert_eq!(verex.source(), r"(?:^(?:http)(?:s)?(?:://)(?:www\.)?(?:[^ ]*)$)");
Example usage of the or!
macro:
#[macro_use(or)]
extern crate verex;
let regex = or!("foo", "bar", "baz")
.compile()
.unwrap();
// Test if the regex matches correctly
assert!(regex.is_match("foo"));
assert!(regex.is_match("bar"));
assert!(regex.is_match("baz"));
assert!(!regex.is_match("bum"));
// Test the generated regex string
assert_eq!(regex.as_str(), r"(?:(?:foo)|(?:bar)|(?:baz))");
Example usage of the or_expr!
macro:
#[macro_use(or_expr)]
extern crate verex;
extern crate regex;
use verex::Expression as E;
use verex::Verex;
use regex::Regex;
let sub_verex = Verex::from_str("Darth(Vader)*?");
let sub_regex = Regex::new("(?P<robot>C3PO)").unwrap();
let regex = or_expr!(
E::String("([RD]2){2}"),
E::Verex(&sub_verex),
E::Regex(&sub_regex))
.compile()
.unwrap();
// Test if the regex matches correctly
assert!(regex.is_match("R2D2"));
assert!(regex.is_match("Darth"));
assert!(regex.is_match("C3PO"));
assert!(!regex.is_match("Anakin"));
// Test the generated regex string
assert_eq!(regex.as_str(), r"(?:(?:([RD]2){2})|(?:(?:Darth(Vader)*?))|(?:(?P<robot>C3PO)))");
Macros§
Structs§
- Verex
- The struct used for building verbal expression objects
Enums§
- Expression
- The enum used to have common functions for different Types
Functions§
- any
- Any of the given characters
- any_of
- See any()
- anything
- Any character zero or more times
- anything_
but - Any character zero or more times except the provided characters
- br
- A line break!
- capture
- Find a specific string and capture it (will get escaped)
- capture_
expr - Find an expression and capture it
- digit
- Add the token for matching digits
- end_
of_ line - Add a token for the end of a line
- find
- Find a specific string
- find_
expr - Find an expression
- line_
break - A line break!
- maybe
- Any string either one or zero times
- maybe_
expr - Any string either one or zero times
- range
- A range of characters e.g. [A-Z] Usage example: verex.range(vec![(‘a’, ‘z’),(‘A’, ‘Z’)])
- search_
one_ line - Toggle whether ^ and $ match line start and end or string start and end
- something
- Any character at least one time
- something_
but - Any character at least one time except for these characters
- start_
of_ line - Add a token for the start of a line
- tab
- Add a token for a tab
- with_
any_ case - Toggle whether to match case-sensitively or not
- word
- Any alphanumeric characters