获取字符串后缀

问题描述 投票:0回答:1

我正在寻找以下签名的函数

val suffix : t -> int -> t

suffix s n
返回
s
的长度小于或等于
n

的最长后缀

标准String模块提供这样的功能吗?如果有的话,如何使用?

我需要排除字符串的第一个字符并使用其余字符,即从最长的正确后缀构造一个字符串。给定

"abc"
,我需要一个字符串
"bc
”。我尝试了以下操作,但失败了

String.suffix s ((String.length s) - 1)

出现以下错误。

Error: Unbound value String.suffix

如何打开模块并使用它?

open String
open Core.Std
失败。

预期的函数签名是从这里复制的。

string ocaml
1个回答
0
投票

仅使用标准 OCaml 库中的

String
Seq
模块:获取字符串的长度,将字符串转换为序列,删除第一个字符,然后删除除
n
之外的所有字符。然后将其转换回字符串。

let suffix s n =
  let len = String.length s in
  s
  |> String.to_seq
  |> Seq.drop 1
  |> Seq.drop (len - n - 1)
  |> String.of_seq
# suffix "abc" 2;;
- : string = "bc"
# suffix "abcd" 2;;
- : string = "cd"
# suffix "abcd" 3;;
- : string = "bcd"
# suffix "ab" 2;;
Exception: Invalid_argument "Seq.drop".

有效!直到没有。我们可以通过简单的检查来解决这个问题。

let suffix s n =
  let len = String.length s in
  if len <= n then 
    "" 
  else 
    s
    |> String.to_seq
    |> Seq.drop 1
    |> Seq.drop @@ len - n - 1
    |> String.of_seq
# suffix "ab" 2;;
- : string = ""
# suffix "abc" 2;;
- : string = "bc"
© www.soinside.com 2019 - 2024. All rights reserved.