在Rust中检查字符串是否以数字开头的更简单方法



我目前使用的是这个

fn main() {
let a = "abc123";
let b = "1a2b3c";
println!("{}", a[0..1].chars().all(char::is_numeric));
println!("{}", b[0..1].chars().all(char::is_numeric));
}

有没有更惯用和/或更简单的方法来做到这一点?

注意:字符串保证为非空,并且由ASCII字符组成。

如果您确定它不是空的并且由ascii组成,则可以直接对字节(u8(进行操作:

a.as_bytes()[0].is_ascii_digit()

(b'0'..=b'9').contains(&a.as_bytes()[0])

更通用的设置(而且,在我看来更惯用(:

a.chars().next().unwrap().is_numeric()

这一切看起来有点笨拙的原因是可能有一些问题(在其他语言中很容易被忽视(:

  • 字符串可能为空=>引导我们进入Option/unwrap-区域
  • rust中的字符串是UTF-8(这基本上使随机访问字符串变得复杂;请注意,rust不仅将0-9视为数字,如下所示(

从您的原始解决方案和parse:开始

fn main() {
let a = "abc123";
let b = "1a2b3c";

println!("{:?}", a[0..1].parse::<u8>().is_ok());  // false
println!("{:?}", b[0..1].parse::<u8>().is_ok());  // true
}

如果第一个字符保证是ASCII,并且字符串不为空。

游乐场

最新更新