1 /// Return a Vec of all substrings contained in '[ ]'s
2 /// Ignore quoted strings and integers.
pull_out_square_bracket(s: &str) -> Vec<String>3 pub fn pull_out_square_bracket(s: &str) -> Vec<String> {
4 let mut chars = s.chars();
5 let mut results = vec![];
6 loop {
7 match chars.next() {
8 Some('[') => {
9 let c = chars.next().unwrap();
10 if c != '"' && c != '\'' {
11 let mut inside_bracket = vec![c];
12 let mut bracket_count = 1;
13 loop {
14 let c = chars.next();
15 match c {
16 Some(']') => bracket_count -= 1,
17 Some('[') => bracket_count += 1,
18 Some(_) => (),
19 None => break,
20 };
21 if bracket_count == 0 {
22 // Only store results which aren't numbers
23 let sub: String = inside_bracket.into_iter().collect();
24 if sub.parse::<usize>().is_err() {
25 results.push(sub);
26 }
27 break;
28 }
29 inside_bracket.push(c.unwrap());
30 }
31 }
32 }
33 None => break,
34 _ => (),
35 }
36 }
37 results
38 }
39
40 #[cfg(test)]
41 mod tests {
42 use super::*;
43
44 #[test]
can_pull_out_square_bracket()45 fn can_pull_out_square_bracket() {
46 assert_eq!(pull_out_square_bracket("hi"), Vec::<String>::new());
47 assert_eq!(pull_out_square_bracket("['hi']"), Vec::<String>::new());
48 assert_eq!(pull_out_square_bracket("[hi] a[0]"), vec!["hi"]);
49 assert_eq!(pull_out_square_bracket("hi [th[e]['r']e] [fish]"), vec!["th[e]['r']e", "fish"]);
50 }
51 }
52