use regex;
pub fn find_first_group(ptn: &str, text: &str) -> Option<String> {
let re = match regex::Regex::new(ptn) {
Ok(x) => x,
Err(_) => return None,
};
match re.captures(text) {
Some(caps) => {
if let Some(x) = caps.get(1) {
return Some(x.as_str().to_owned());
}
}
None => {
return None;
}
}
None
}
pub fn re_contains(text: &str, ptn: &str) -> bool {
let re = match regex::Regex::new(ptn) {
Ok(x) => x,
Err(e) => {
println!("Regex new error: {:?}", e);
return false;
}
};
re.is_match(text)
}
pub fn replace_all(text: &str, ptn: &str, ptn_to: &str) -> String {
let re = regex::Regex::new(ptn).unwrap();
let result = re.replace_all(text, ptn_to);
result.to_string()
}
#[cfg(test)]
mod tests {
use super::find_first_group;
#[test]
fn test_find_first_group() {
let s = find_first_group(r"", "");
assert_eq!(s, None);
let s = find_first_group(r"abc", "123");
assert_eq!(s, None);
let s = find_first_group(r"\$\((.+)\)", "ls -l $(find x) -h");
assert_eq!(s, Some("find x".to_string()));
let s = find_first_group(r"(\d+)-(\d+)-(\d+)", "2017-09-16");
assert_eq!(s, Some("2017".to_string()));
}
}