rust - 如何匹配所有空格?

标签 rust

<分区>

上下文:Rust 具有match 结构,这对于制作(可能)详尽的案例及其相应结果列表非常有用。问题是:如何创建包含许多案例子集的案例?

关于我的具体问题,我正在制作一个词法分析器,它逐个字符地读取一个字符串并吐出标记。它的主要功能如下所示:

(...)
    fn new(input: &str) -> Lexer {
        let mut characters = input.chars();
        for c in characters {
            let mut token: Option<Token> = match c {
                '+' => Some(Token::Add),
                '-' => Some(Token::Minus),
                '*' => Some(Token::Mul),
                '/' => Some(Token::Div),
                'e' => Some(Token::EulersNum),
                'π' => Some(Token::Pi),
                '(' => Some(Token::LeftParen),
                ')' => Some(Token::RightParen),
                ' ' | '\t' | '\n' => continue, //Whitespace
                _ => None
            };

            if token == None {
                continue;
            }
        }

        todo!()
    }
(...)

现在,就此问题而言,最重要的部分是用“空白”注释的部分。我处理空格的问题是它可能不对应于给定字符串格式中空格的实际实现。当然,我可以处理所有不同种类的 ascii 空格,但是 Unicode 呢?制作一个详尽的空格列表不仅很麻烦,而且还会混淆代码。它应该留给语言,而不是它的用户。

是否可以仅将其与“空白”表达式匹配,例如:

(...)

Whitespace => continue,

(...)

如果可以,我该怎么做?

最佳答案

你可以使用 char::is_whitespace()在比赛后卫中:

match c {
    '+' => Some(Token::Add),
    '-' => Some(Token::Minus),
    '*' => Some(Token::Mul),
    '/' => Some(Token::Div),
    c if c.is_whitespace() => Some(Token::Whitespace),
    _ => None,
};

Playground link

关于rust - 如何匹配所有空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65605829/

相关文章:

rust - 为什么 reqwest 不在此请求中返回内容长度?

generics - 无法访问动态特征实现中的结构字段

rust - 在 for 循环中使用拥有的指针访问枚举的内容

rust - 可变和不可变数据访问

struct - 添加到 struct/impl 的生命周期使模块无法解析

rust - 在带有 rust 的向量中实现特征的问题

concurrency - 如果做错了,为什么用餐哲学家不会陷入僵局?

generics - 我如何构造实现特征的潜在许多结构中的任何一个?

rust - 如何在数据结构中存储带有 BufReader 和 BufWriter 的 TcpStream

rust - cargo 构建失败 : could not find macro `llvm_asm` in this scope