我使用Str.regexp,我想知道如何检查未确定长度的字符串是否只包含数字字符。
这就是我正在做的事情:
Str.string_match "[0-9]+" "1212df3124" 0;;
问题是它的计算结果为true,但它应该返回false,因为它包含' df'子。 (这与C#regexp,它的Ocaml不同)
答案 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
返回整数的字符串表示形式,以十进制表示。