创建一个函数,用开头和结尾的两个字符串覆盖一个字符串
Make a function that overwrites one string with two strings in the beginning and end
我正在使用 Racket 的奇怪语言在开头和结尾用另外两个字符串覆盖一个字符串。
(define overwrite (s beg end)...
例如(overwrite "catapult" "dog" "blah")
应该输出"dogablah"
(overwrite "greenbeans" "munk" "grub")
应该输出 "munknbgrub"
.
有时覆盖可以完全覆盖中心词:
(overwrite "dog" "mouse" "flea")
应该输出 "mouseflea"
.
主要问题是我只被允许使用三个内置函数来尝试解决这个问题。 (字符串长度)、(子字符串)和(字符串追加)
我尝试了以下方法但无济于事:
(define (overwrite s beg end)
(string-append (substring s 0 (string-length beg)) ""
(substring s (- (string-length s) (string-length end))
(string-length s))))
我可以使用辅助函数和其他基本数学函数,但这是我以前从未做过的事情。太糟糕了 scheme/racket 没有一些易于使用的替换功能。
提前致谢!这是我所能得到的最具体的。
显然发现这是一个单行答案。废话!
(define (overwrite s beg end)
(string-append beg (substring s (string-length beg) (- (string-length s) (string-length end))) end))
我的意思是,如果有人有更好的方法,请随时分享。
使用您的单线解决方案:
(define (overwrite s beg end)
(string-append beg (substring s (string-length beg) (- (string-length s) (string-length end))) end)
请注意以下内容会起作用:
(overwrite "greenbeans" "munk" "grub")
=> "munknbgrub"
但以下会失败:
(overwrite "dog" "mouse" "flea")
原因是,substring
只接受非负整数作为参数。由于参数
(- (string-length s) (string-length end))
当 s
的字符串长度小于 end
时, 变为负数,例如。 "dog" 对比 "flea",这将引发异常。
您可以通过检查 s
的长度是否小于 beg
和 end
的总长度来解决这个问题,在这种情况下,您只需附加 beg
和 end
。例如:
(define (overwrite s beg end)
(let ((l1 (string-length s))
(l2 (string-length beg))
(l3 (string-length end)))
(if (>= (+ l2 l3) l1)
(string-append beg end)
(string-append beg (substring s l2 (- l1 l3)) end))))
那么你将拥有:
(overwrite "greenbeans" "munk" "grub")
=> "munknbgrub"
(overwrite "dog" "mouse" "flea")
=> "mouseflea"
我正在使用 Racket 的奇怪语言在开头和结尾用另外两个字符串覆盖一个字符串。
(define overwrite (s beg end)...
例如(overwrite "catapult" "dog" "blah")
应该输出"dogablah"
(overwrite "greenbeans" "munk" "grub")
应该输出 "munknbgrub"
.
有时覆盖可以完全覆盖中心词:
(overwrite "dog" "mouse" "flea")
应该输出 "mouseflea"
.
主要问题是我只被允许使用三个内置函数来尝试解决这个问题。 (字符串长度)、(子字符串)和(字符串追加)
我尝试了以下方法但无济于事:
(define (overwrite s beg end)
(string-append (substring s 0 (string-length beg)) ""
(substring s (- (string-length s) (string-length end))
(string-length s))))
我可以使用辅助函数和其他基本数学函数,但这是我以前从未做过的事情。太糟糕了 scheme/racket 没有一些易于使用的替换功能。 提前致谢!这是我所能得到的最具体的。
显然发现这是一个单行答案。废话!
(define (overwrite s beg end)
(string-append beg (substring s (string-length beg) (- (string-length s) (string-length end))) end))
我的意思是,如果有人有更好的方法,请随时分享。
使用您的单线解决方案:
(define (overwrite s beg end)
(string-append beg (substring s (string-length beg) (- (string-length s) (string-length end))) end)
请注意以下内容会起作用:
(overwrite "greenbeans" "munk" "grub")
=> "munknbgrub"
但以下会失败:
(overwrite "dog" "mouse" "flea")
原因是,substring
只接受非负整数作为参数。由于参数
(- (string-length s) (string-length end))
当 s
的字符串长度小于 end
时,变为负数,例如。 "dog" 对比 "flea",这将引发异常。
您可以通过检查 s
的长度是否小于 beg
和 end
的总长度来解决这个问题,在这种情况下,您只需附加 beg
和 end
。例如:
(define (overwrite s beg end)
(let ((l1 (string-length s))
(l2 (string-length beg))
(l3 (string-length end)))
(if (>= (+ l2 l3) l1)
(string-append beg end)
(string-append beg (substring s l2 (- l1 l3)) end))))
那么你将拥有:
(overwrite "greenbeans" "munk" "grub")
=> "munknbgrub"
(overwrite "dog" "mouse" "flea")
=> "mouseflea"