Vec<u8>
で正規表現を使う場合以下の2パターンがある
Vec<u8> を String に変換する(または最初から String で入力を受け取る)
// s は Vec<u8>。もとからString であればこんなことしなくて良い。
let re = Regex::new(r"^<=+>$").unwrap();
let ans = re.is_match(&String::from_utf8(s.clone()).unwrap());
regex::bytes::Regex
を使う
use regex::bytes::Regex; // ここを変えるだけ
let re = Regex::new(r"^<=+>$").unwrap();
let s = b"<====>";
let ans = re.is_match(s);
regex::Regex
の場合is_match
replace
, replace_all
, replace_n
find
find_iter
競プロではだいたい、is_match と replace (replace_all) で事足りるはず。
let re = Regex::new(r"^<=+>$").unwrap();
let s = "<====>";
let ans = re.is_match(s);
通常
let re = Regex::new(r"[^01]+").unwrap();
assert_eq!(re.replace("1078910234", ""), "1010234"); // 1回だけ replace する
assert_eq!(re.replace_all("1078910234", ""), "1010"); // 複数回 replace する
// 回数指定は replacen
キャプチャーを使ったもの
let re = Regex::new(r"([^,\\s]+),\\s+(\\S+)").unwrap();
let result = re.replace("Springsteen, Bruce", |caps: &Captures| {
format!("{} {}", &caps[2], &caps[1])
});
assert_eq!(result, "Bruce Springsteen");
let re = Regex::new(r"(?<y>\\d{4})-(?<m>\\d{2})-(?<d>\\d{2})").unwrap();
let before = "1973-01-05, 1975-08-25 and 1980-10-18";
let after = re.replace_all(before, "$m/$d/$y");
assert_eq!(after, "01/05/1973, 08/25/1975 and 10/18/1980");
参考: replace の型
pub fn replace<'h, R: Replacer>(
&self,
haystack: &'h str,
rep: R
) -> Cow<'h, str>