MST

星途 面试题库

面试题:Rust正则表达式匹配复杂日期格式

假设要匹配的日期格式较为复杂,可能是"YYYY - MM - DD HH:MM:SS"(如"2023 - 10 - 05 14:30:00"),也可能是"MM/DD/YYYY HH:MM:SS AM/PM"(如"10/05/2023 02:30:00 PM")这样的格式。请用Rust编写一个函数,接收一个字符串,使用正则表达式匹配上述日期格式,如果匹配成功,返回对应的日期时间信息(可自行定义合适的数据结构来存储),如果匹配失败返回None。注意处理不同格式中的分隔符、时间格式等细节。
42.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use regex::Regex;
use std::fmt;

// 定义一个结构体来存储日期时间信息
#[derive(Debug)]
struct DateTimeInfo {
    year: i32,
    month: u8,
    day: u8,
    hour: u8,
    minute: u8,
    second: u8,
    am_pm: Option<String>,
}

impl fmt::Display for DateTimeInfo {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        if let Some(ampm) = &self.am_pm {
            write!(f, "{:02}/{:02}/{:04} {:02}:{:02}:{:02} {}", self.month, self.day, self.year, self.hour, self.minute, self.second, ampm)
        } else {
            write!(f, "{:04}-{:02}-{:02} {:02}:{:02}:{:02}", self.year, self.month, self.day, self.hour, self.minute, self.second)
        }
    }
}

fn parse_date_time(s: &str) -> Option<DateTimeInfo> {
    // 定义两种日期格式的正则表达式
    let re1 = Regex::new(r"(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})").unwrap();
    let re2 = Regex::new(r"(\d{2})/(\d{2})/(\d{4}) (\d{1,2}):(\d{2}):(\d{2}) (AM|PM)").unwrap();

    if let Some(captures) = re1.captures(s) {
        let year: i32 = captures[1].parse().ok()?;
        let month: u8 = captures[2].parse().ok()?;
        let day: u8 = captures[3].parse().ok()?;
        let hour: u8 = captures[4].parse().ok()?;
        let minute: u8 = captures[5].parse().ok()?;
        let second: u8 = captures[6].parse().ok()?;

        Some(DateTimeInfo {
            year,
            month,
            day,
            hour,
            minute,
            second,
            am_pm: None,
        })
    } else if let Some(captures) = re2.captures(s) {
        let year: i32 = captures[3].parse().ok()?;
        let month: u8 = captures[1].parse().ok()?;
        let day: u8 = captures[2].parse().ok()?;
        let mut hour: u8 = captures[4].parse().ok()?;
        if captures[6] == "PM" && hour != 12 {
            hour += 12;
        } else if captures[6] == "AM" && hour == 12 {
            hour = 0;
        }
        let minute: u8 = captures[5].parse().ok()?;
        let second: u8 = captures[6].parse().ok()?;

        Some(DateTimeInfo {
            year,
            month,
            day,
            hour,
            minute,
            second,
            am_pm: Some(captures[6].to_string()),
        })
    } else {
        None
    }
}

你可以这样调用这个函数:

fn main() {
    let date1 = "2023-10-05 14:30:00";
    let date2 = "10/05/2023 02:30:00 PM";

    if let Some(info) = parse_date_time(date1) {
        println!("Parsed: {}", info);
    } else {
        println!("Parse failed for date1");
    }

    if let Some(info) = parse_date_time(date2) {
        println!("Parsed: {}", info);
    } else {
        println!("Parse failed for date2");
    }
}

在上述代码中:

  1. 定义了DateTimeInfo结构体来存储日期时间信息,包含年、月、日、时、分、秒以及上午/下午标识(如果有的话)。
  2. parse_date_time函数使用两个正则表达式分别匹配两种日期格式,成功匹配后解析出相应的日期时间信息并返回Some(DateTimeInfo),匹配失败返回None
  3. main函数中,对两种日期格式的字符串进行测试。