Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看个编程挑战:首字母缩略词。
提问
莉莉丝接到一个任务,需要将一系列短语转换为其首字母缩略词。莉莉丝将编写一个程序来帮助生成一些术语,该程序将长名称(例如 Portable Network Graphics)转换为其首字母缩略词(PNG)。
连字符和空格是单词分隔符,其他标点符号都可以忽略掉。
例:
| Input | Output |
|---|---|
| As Soon As Possible | ASAP |
| Liquid-crystal display | LCD |
| Thank George It's Friday! | TGIF |
| First In, First Out | FIFO |
| Halley's Comet | HC |
| The Road _Not_ Taken | TRNT |
| HyperText Markup Language | HTML |
| GNU Image Manipulation Program | GIMP |
模板:
pub fn abbreviate(phrase: &str) -> String {
todo!("Given the phrase '{phrase}', return its acronym");
}
分析
注意看给的例子,我们得出如下结论:
- 分割单词之后,首字母大写即可,所以首要任务是如何分割单词
- HyperText 分割之后会变成 Hyper 和 Text
- It's 和 Halley's ,都是一个单词
- Liquid-crystal ,连字符和空格一样,是用来分割单词的
- GNU 是一个单词
完成如上分析后,我们使用正则表达式来分割短语,之后返回首字母即可。
解决方案
pub fn abbreviate(phrase: &str) -> String {
String::from_iter(Regex::new(r"([a-z']+)|([A-Z][a-z']+)|([A-Z]+)").unwrap().find_iter(phrase).map(|s| s.as_str().chars().next().unwrap().to_ascii_uppercase()))
}
Trick
Regex::new(r"([a-z']+)|([A-Z][a-z']+)|([A-Z]+)"),我们先匹配可能带'的单词,然后匹配以大写字母开头小字母结尾的单词,最后匹配全大写字母的单词。- 匹配到的单词,通过
s.as_str().chars().next().unwrap().to_ascii_uppercase()可以获取首字母的大写。chars().next()就是首字母了。