// include the latest version of the regex crate in your Cargo.toml
extern crate regex;
use regex::Regex;
fn main() {
let regex = Regex::new(r"(?<scheme>[^!$&'()*,;=@//:\s]+):(?<authority>//(?<userinfo>(?<username>[\w\.\-!$&'()*,;=]+):?(?<password>[\w\.\-!$&'()*,;=]+)?@)?(?<host>[^\s\n\t\r/:\[\]]+|\[[^\s\n\t\r/:\[\]]+\]):?(?<port>\d{1,5})?)?[/]?(?<path>[^\s\?#]{1,}(?:\?(?<query>[^\s#]+))?(?:#(?<fragment>[^\s]+))?)?").unwrap();
let string = "example from wikipedia URI:
userinfo host port
┌─┴─────┐
user pass
┌──┴───────┴───┐┌──────┴──────┐ ┌┴─┐
https://john.doe:example@www.example.com:1234/forum/questions/?tag=networking&order=newest#top
└─┬─┘ └─────────────┬─────────────┘└───────┬───────┘ └────────────┬────────────┘ └┬┘
scheme authority path query fragment
userinfo host port
┌──┴───┐ ┌──────┴──────┐ ┌┴─┐
https://john.doe@www.example.com:1234/forum/questions/?tag=networking&order=newest#:~:text=whatever
└─┬─┘ └─────────────┬─────────────┘└───────┬───────┘ └────────────┬────────────┘ └───────┬───────┘
scheme authority path query fragment
ldap://[2001:db8::7]/c=GB?objectClass?one
└┬─┘ └─────┬─────┘└─┬─┘ └──────┬──────┘
scheme authority path query
mailto:John.Doe@example.com
└─┬──┘ └────┬─────────────┘
scheme path
news:comp.infosystems.www.servers.unix
└┬─┘ └─────────────┬─────────────────┘
scheme path
tel:+1-816-555-1212
└┬┘ └──────┬──────┘
scheme path
telnet://192.0.2.16:80/
└─┬──┘ └─────┬─────┘│
scheme authority path
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
└┬┘ └──────────────────────┬──────────────────────┘
scheme path";
// result will be an iterator over tuples containing the start and end indices for each match in the string
let result = regex.captures_iter(string);
for mat in result {
println!("{:?}", mat);
}
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Rust, please visit: https://docs.rs/regex/latest/regex/