lsn/
lib.rs

1
2use regex::Regex;
3
4pub fn build_regex() -> Regex {
5    Regex::new(r"^(?<stem>(?:.*\D)?)(?<num>\d+)(?<ext>(?:\..*)?)$").unwrap()
6}
7
8#[cfg(test)]
9mod tests {
10    use super::*;
11
12    #[test]
13    fn digit_in_extension() {
14        let regex = build_regex();
15        let s = "test2.3dv";
16        let caps = regex.captures(s).unwrap();
17        assert_eq!("test", &caps["stem"]);
18        assert_eq!("2", &caps["num"]);
19        assert_eq!(".3dv", &caps["ext"]);
20    }
21
22    #[test]
23    fn basic() {
24        let regex = build_regex();
25        let s = "test2.txt";
26        let caps = regex.captures(s).unwrap();
27        assert_eq!("test", &caps["stem"]);
28        assert_eq!("2", &caps["num"]);
29        assert_eq!(".txt", &caps["ext"]);
30    }
31
32    #[test]
33    fn many_digits() {
34        let regex = build_regex();
35        let s = "some1other5test2.3dv";
36        let caps = regex.captures(s).unwrap();
37        assert_eq!("some1other5test", &caps["stem"]);
38        assert_eq!("2", &caps["num"]);
39        assert_eq!(".3dv", &caps["ext"]);
40    }
41
42    #[test]
43    fn no_extension() {
44        let regex = build_regex();
45        let s = "some1other5test2";
46        let caps = regex.captures(s).unwrap();
47        assert_eq!("some1other5test", &caps["stem"]);
48        assert_eq!("2", &caps["num"]);
49        assert_eq!("", &caps["ext"]);
50    }
51
52    #[test]
53    fn one_period_extension() {
54        let regex = build_regex();
55        let s = "some1other5test2.";
56        let caps = regex.captures(s).unwrap();
57        assert_eq!("some1other5test", &caps["stem"]);
58        assert_eq!("2", &caps["num"]);
59        assert_eq!(".", &caps["ext"]);
60    }
61
62    #[test]
63    fn start_with_number() {
64        let regex = build_regex();
65        let s = "0some1other5test2.t";
66        let caps = regex.captures(s).unwrap();
67        assert_eq!("0some1other5test", &caps["stem"]);
68        assert_eq!("2", &caps["num"]);
69        assert_eq!(".t", &caps["ext"]);
70    }
71
72    #[test]
73    fn just_number_with_extension() {
74        let regex = build_regex();
75        let s = "01.t";
76        let caps = regex.captures(s).unwrap();
77        assert_eq!("", &caps["stem"]);
78        assert_eq!("01", &caps["num"]);
79        assert_eq!(".t", &caps["ext"]);
80    }
81
82    #[test]
83    fn just_number() {
84        let regex = build_regex();
85        let s = "01";
86        let caps = regex.captures(s).unwrap();
87        assert_eq!("", &caps["stem"]);
88        assert_eq!("01", &caps["num"]);
89        assert_eq!("", &caps["ext"]);
90    }
91}