如何验证字符串是否仅包含Ocaml中的数字字符

时间:2017-04-22 01:32:14

标签: ocaml

我使用Str.regexp,我想知道如何检查未确定长度的字符串是否只包含数字字符。

这就是我正在做的事情:

Str.string_match "[0-9]+" "1212df3124" 0;;

问题是它的计算结果为true,但它应该返回false,因为它包含' df'子。 (这与C#regexp,它的Ocaml不同)

2 个答案:

答案 0 :(得分:1)

Str.string_match函数检查模式是否与您提供的索引开始匹配。只要字符串开头至少有一个数字,您的模式就会匹配。如果字符串以数字以外的其他内容开头,则您的模式将无法匹配:

# Str.string_match (Str.regexp "[0-9]+") "df3124" 0;;
- : bool = false

要检查整个字符串,您需要"锚定"使用$结束的模式。即,您需要确保匹配到字符串的末尾。

# Str.string_match (Str.regexp "[0-9]+") "1212df3124" 0;;
- : bool = true
# Str.string_match (Str.regexp "[0-9]+$") "1212df3124" 0;;
- : bool = false
# Str.string_match (Str.regexp "[0-9]+$") "3141592" 0;;
- : bool = true
# Str.string_match (Str.regexp "[0-9]+$") "" 0;;
- : bool = false

答案 1 :(得分:0)

另一种解决方案是使用 int_of_string 来查看它是否会引发异常:

let check_str s = 
  try int_of_string s |> ignore; true
  with Failure _ -> false

如果您要将字符串转换为整数,则可以使用它。

请注意,它将允许everything that OCaml's parser consider to be an integer

check_str "10";;   //gives true
check_str "0b10";; //gives true, 0b11 = 2
check_str "0o10";; //gives true, 0o10 = 8
check_str "0x10";; //gives true, 0x10 = 16

因此,如果您只想允许十进制表示,您可以这样做:

let check_str s = 
  try (int_of_string s |> string_of_int) = s
  with Failure _ -> false

as string_of_int返回整数的字符串表示形式,以十进制表示。