// 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#"(?xs)^(?P<timestamp>.{19})\ \[(?P<severity>\w{4,6})\]
\ \d+\#\d+:\ (\*\d+\ )?
(?P<err_msg>
(?:\"\S+\"\sis\snot\s)?
(?P<err_type>\w+)[\s(]
(?:requests,\ excess:\ (?P<err_rate>\d+\.\d+)
\ by\ zone\ \"(?P<err_zone>\S+)\"
|.+?)
)
(?:
,\ client:\ (?P<remote_addr>\d+\.\d+\.\d+\.\d+)
,\ server:\ (?P<server>[^,\a]+)
(?:,\ request:\ \"(?P<method>[A-Z]{3,4}?)
\ (?P<uri>\/\S*?)(?P<uri_query>\?\S+)?
\ (?P<protocol>\S+)\"
)?
(?:,\ upstream:\ \"(?P<upstream>.+?)\")?
(?:,\ host:\ \"(?P<req_host>\S+)\")?
(?:,\ referrer:\ \"(?P<referrer>\S+)\")?
|)
$"#).unwrap();
let string = "2023/06/16 17:12:30 [error] 1814859#1814859: *228570402 limiting requests, excess: 50.120 by zone \"resizerzone\", client: 10.5.0.122, server: app.market.com, request: \"GET /resizer/view?key=8e158c8741ce849a09ef84d316bb68e7&b=productimages&f=webp&s=0 HTTP/1.1\", host: \"market.com\", referrer: \"https://market.com/\"
";
// result will be a tuple containing the start and end indices for the first match in the string
let result = regex.captures(string);
let (start, end) = match result {
Some((s, e)) => (s, e),
None => {
// ...
}
};
println!("{}", &string[start, end]);
}
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/