Rust 如何匹配所有空格?

Rust 如何匹配所有空格?,rust,Rust,上下文:Rust具有匹配结构,这对于创建(可能的)案例及其相应结果的详尽列表非常有用。问题是:如何创建包含许多案例子集的案例 关于我的具体问题,我正在制作一个lexer,它一个字符接一个字符地读取字符串,并吐出标记。其主要功能如下所示: (…) fn新建(输入:&str)->Lexer{ 让mut characters=input.chars(); 对于字符中的c{ 让mut标记:选项=匹配c{ “+”=>Some(令牌::添加), '-'=>Some(标记::减号), '*'=>Some(令牌

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

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

(…)
fn新建(输入:&str)->Lexer{
让mut characters=input.chars();
对于字符中的c{
让mut标记:选项=匹配c{
“+”=>Some(令牌::添加),
'-'=>Some(标记::减号),
'*'=>Some(令牌::Mul),
“/”=>Some(令牌::Div),
'e'=>Some(标记::EulersNum),
'π'=>Some(令牌::π),
“(”=>Some(Token::LeftParen),
“)”=>Some(Token::RightParen),
''|'\t'|'\n'=>继续,//空白
_=>无
};
如果令牌==无{
继续;
}
}
待办事项!()
}
(...)
现在,就这个问题而言,最重要的部分是用“空白”注释的部分。我处理空白的问题是,它可能与给定字符串格式中空白的实际实现不一致。当然,我可以处理所有不同类型的ascii空白,但是Unicode呢?制作一个完整的空白列表不仅麻烦,而且会混淆代码。它应该留给语言,而不是它的用户

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

(…)
空白=>继续,
(...)
如果是,我该怎么做

当然,我可以处理所有不同类型的ascii空白,但是Unicode呢

使用一个库,该库为许多字符串格式或更复杂的匹配功能(如果需要)提供
is_whitespace()
函数

否则,如果只需要匹配Unicode空白,请使用类似于
char::is_whitespace()
的函数

制作一个完整的空白列表不仅麻烦,而且会混淆代码。它应该留给语言,而不是它的用户

不,匹配(和模式匹配等)是通用工具。Rust不是专门用于语言或字符串处理的语言。因此,在模式匹配中添加对“空白匹配”的支持是没有意义的

Rust具有基本的ASCII、UTF-8、UTF-16等支持,这是出于实际原因,但仅此而已。在标准库中添加复杂位是有争议的。

您可以在match guard中使用:

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

这并不是真正正确的抽象级别。只需编写一个函数来确定某个内容是否为空白,并使用if语句即可。如果您确实必须保存函数调用,请从标准库复制代码。
制作一个完整的空白列表不仅麻烦,而且会混淆代码。它应该留给语言,而不是它的用户。
不。真的不。它应该留给库。不是投票人,但是:我不明白你的第一句话。外部板条箱应该提供什么,而
char::is_whitespace
不提供什么?char-one支持unicode,所以这不是交易。对ASCII和UTF-16的第二个“支持”是。。。备用的?我的意思是,有
char::is_ascii_whitespace
yes。但是Rust中的每个
字符串
str
char
都是UTF-8。如果您需要其他解释,您必须使用外部板条箱。Ivan还展示了一个如何正确执行的示例,这也可能出现在您的答案中。问题本质上是“如何匹配匹配表达式的一个臂中的所有空白字符?”。这个答案从“使用外部库”开始,没有解释如何在一个匹配臂中匹配所有空格,然后讨论
match
不应该是这个工作的工具。@hellow这个问题不仅涉及ASCII或Unicode,还涉及“几种字符串格式”。因此,我将这个问题理解为一个更抽象的问题:“为什么像Rust这样的语言不允许更多的字符串/复杂的/正则表达式/…模式匹配?”。既然复制品已经被标记了,而另一个答案也说了同样的话,我更愿意在答案中讨论OP的视角有什么问题。这是最有用的答案。它很简单,并且在代码中准确地显示了意图。谢谢