feat: add absolute dates/months to dictionary
This commit is contained in:
parent
c9433d721d
commit
d18f175aef
10 changed files with 9942 additions and 1834 deletions
41
src/util.rs
41
src/util.rs
|
|
@ -59,8 +59,36 @@ pub fn parse_numeric<F>(string: &str) -> Result<F, F::Err>
|
|||
where
|
||||
F: FromStr,
|
||||
{
|
||||
static NUM_PATTERN: Lazy<Regex> = Lazy::new(|| Regex::new("\\D+").unwrap());
|
||||
NUM_PATTERN.replace_all(string, "").parse()
|
||||
let mut buf = String::new();
|
||||
for c in string.chars() {
|
||||
if c.is_ascii_digit() {
|
||||
buf.push(c);
|
||||
}
|
||||
}
|
||||
buf.parse()
|
||||
}
|
||||
|
||||
/// Parse all numbers occurring in a string and reurn them as a vec
|
||||
pub fn parse_numeric_vec<F>(string: &str) -> Vec<F>
|
||||
where
|
||||
F: FromStr,
|
||||
{
|
||||
let mut numbers = vec![];
|
||||
|
||||
let mut buf = String::new();
|
||||
for c in string.chars() {
|
||||
if c.is_ascii_digit() {
|
||||
buf.push(c);
|
||||
} else if !buf.is_empty() {
|
||||
buf.parse::<F>().map_or((), |n| numbers.push(n));
|
||||
buf.clear();
|
||||
}
|
||||
}
|
||||
if !buf.is_empty() {
|
||||
buf.parse::<F>().map_or((), |n| numbers.push(n));
|
||||
}
|
||||
|
||||
numbers
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
|
@ -76,4 +104,13 @@ mod tests {
|
|||
let n = parse_numeric::<u32>(string).unwrap();
|
||||
assert_eq!(n, expect);
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case("15.03.2022", vec![15, 3, 2022])]
|
||||
#[case("4 Hello World 2", vec![4, 2])]
|
||||
#[case("最后更新时间:2020年1月3日", vec![2020, 1, 3])]
|
||||
fn t_parse_numeric_vec(#[case] string: &str, #[case] expect: Vec<u32>) {
|
||||
let n = parse_numeric_vec::<u32>(string);
|
||||
assert_eq!(n, expect);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Reference in a new issue