首页 > 解决方案 > 在某些条件下提取字符串中的子字符串

问题描述

我希望你一切都好 !我向你提出我的问题。我有一个字符串(在单行上),想法是从字符串中的给定位置迭代字符串,逐个字符向左移动并在遇到分隔符时停止(分隔符在列表中),然后执行在右边和最后,将两者放在一起形成您要查找的单词。我编写了以下函数,但它并不完全有效,当我将自己定位在一个单词的末尾(如位置 4)时,它会返回一个字符串“”而不是返回“this”。当我转到位置 1 时,它发送给我的是“他的”而不是“这个”。当我将自己置于 44 位时,我输出的是“tha”而不是“that”。另一方面,在字符串的中间位置 36 或 40,它可以工作。谁能帮我修复这些错误?

(* separators *)
let sep_list = [';';',';'(';')';'.';' ';]

(* my string to test *)
let my_str = "this is my string for testing purpose, only that"

(* my function *)
let search_word_in_cursor (str:string) (char_list:char list) (pos:int) : string = 
  let rec foo_left (str:string) (char_list:char list) (pos:int) (ret:string) : string =
    if ((List.exists (fun x -> Char.equal x str.[pos]) char_list) || (pos <= 0)) then ret 
    else if (pos == 0) then String.make 1 str.[pos] ^ ret 
    else foo_left str char_list (pos - 1) ((String.make 1 str.[pos]) ^ ret)
  in
  let rec foo_right (str:string) (char_list:char list) (pos:int) (ret:string) : string =
    if ((List.exists (fun x -> Char.equal x str.[pos]) char_list) || (pos >= (String.length str - 1))) then ret 
    else foo_right str char_list (pos + 1) (ret ^ (String.make 1 str.[pos]))
  in
  let sl = foo_left str char_list pos "" in 
  let sr = foo_right str char_list pos "" in 
  if (sr == "" && sl == "") then "" 
  else if (sr == "" && sl != "") then sl
  else if (sr != "" && sl == "") then sr
  else (String.sub sl 0 (String.length sl - 1)) ^ sr

  (* expects and results *)
  let () = 
      print_string (search_word_in_cursor my_str sep_list 4); (* expected:"this" output:"" *)
      print_string (search_word_in_cursor my_str sep_list 1);(* expected:"this" output:"his" *)
      print_string (search_word_in_cursor my_str sep_list 44);(* expected:"that" output:"tha" *)
      print_string (search_word_in_cursor my_str sep_list 36);(* expected:"purpose" output:"purpose" *)
      print_string (search_word_in_cursor my_str sep_list 40)(* expected:"only" output:"only" *)

谢谢大家,goog!

标签: stringocaml

解决方案


推荐阅读