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