[炼手Rust]首字母缩略词

119 阅读1分钟

Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看个编程挑战:首字母缩略词。

AdobeStock_283958328-800x400-1.jpg

提问

莉莉丝接到一个任务,需要将一系列短语转换为其首字母缩略词。莉莉丝将编写一个程序来帮助生成一些术语,该程序将长名称(例如 Portable Network Graphics)转换为其首字母缩略词(PNG)。

连字符和空格是单词分隔符,其他标点符号都可以忽略掉。

例:

InputOutput
As Soon As PossibleASAP
Liquid-crystal displayLCD
Thank George It's Friday!TGIF
First In, First OutFIFO
Halley's CometHC
The Road _Not_ TakenTRNT
HyperText Markup LanguageHTML
GNU Image Manipulation ProgramGIMP

模板:

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

  1. Regex::new(r"([a-z']+)|([A-Z][a-z']+)|([A-Z]+)"),我们先匹配可能带'的单词,然后匹配以大写字母开头小字母结尾的单词,最后匹配全大写字母的单词。
  2. 匹配到的单词,通过s.as_str().chars().next().unwrap().to_ascii_uppercase()可以获取首字母的大写。chars().next()就是首字母了。