// 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"(?mx)^(?: # non-capture group (repeat)
(?| # branch reset for group 1
([^)(><\n])| # either non-bracket... or:
<(?=.*(>))| # if < open angle capture > to group 1
>(?=.*(<))| # if > capture opening < to group 1
\((?=.*(\)))| # same for (), if ( capture ) to group 1
\)(?=.*(\()) # if ) catpure ( to group 1
)(?=.*((?(2)\1\2|\1))$) # cond (2): if not outer chr (fwd ref)
)*? # as few as possible (lazy) / eof non-cap
[^)(><\n]? # the middle character (no parens)
\2$ # the right part (group 2 capture)").unwrap();
let string = "(_)tar<>rat(_)
)()_<(*&bab&*)>_()(
)(*?*)(
()<_<oxxo>_>()
<__>w(owiwo)w<__>
a(t<()((<oyo>))()>t)a
v
(_)tar<>rap(_)
)()_<(*&bab&*)>_))(
)(*?*)(.
()<-<oxxo>_>()
<__>w(ow(wo)w<__>
at<()((<oyo>))()>t)a";
// 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/