string-trim 和 cl-ppcre 不能 trim #\Newline

string-trim and cl-ppcre cannot trim #\Newline

我在 raspberry pi(机器类型 armv61,debian jessie)上使用 Clozure CL 1.11 通过 ojdbc7.jar:

运行 oracle 查询
(defun query (statement)
  (let ((options   ; compiled java filename is Query.class 
        (list "-cp" "/java-files-dir/ojdbc7.jar:/java-files-dir/" "Query" statement))))))
    (with-output-to-string
        (stream)
      (ccl:run-program "java" options :output stream))))

结果如下:

"DAVY 
JONES 

"

当我将结果字符串强制转换为列表时,我看到列由 #\#\Newline 分隔,而字符串的末尾包含一个 #\ 和两个#\Newline 个字符:

(#\D #\A #\V #\Y #\  #\Newline #\J #\O #\N #\E #\S #\  #\Newline #\Newline)

我通读了 this answer and CLHS,但仍然不明白为什么 string-trim 不能 trim #\newline#\linefeed#\return 的任何内容,和

(cl-ppcre:regex-replace "#\Newline" (query "...statement...") "")
(cl-ppcre:regex-replace #\Newline (query "...statement...") "")

也不起作用,而

(cl-ppcre:split #\Newline (query "...statement..."))

成功将列拆分为列表,如 ("DAVY " "JONES ")

编辑

我注意到上面带有 "#\Newline" 的删除线代码显然引起了混淆,我可能将 string-trim 称为“#\Newline”,但这是一个错字。

调用(cl-ppcre:regex-replace#\newline ...)(string-trim '(#\Newline) ...)都不能去掉#\newlines.
实际上,我可以通过调用 (cl-ppcre:split #\Newline 来处理我的工作,在某些情况下我什至可能更喜欢这样。

不过,我想明白为什么调用string-trim with '(#\Newline) trims 字符串末尾的#\Newlines,却不能trim #\单词之间换行。

(cl-ppcre:regex-replace "#\Newline" (query "...statement...") "")

这里的问题是你不能在字符串中使用像 #\Newline 这样的字符语法。它将被简单地读作一个 8 个字符的字符串。

正如 Renzo 在评论中提到的,您可以将 STRING-TRIM 中的字符作为列表而不是字符串提供给 trim。

(string-trim '(#\space #\newline) "DAVY 
JONES 

")
;=> "DAVY 
;   JONES"

你也可以只在字符串中写换行符,虽然这样看起来很丑(你也可以使用CL-INTERPOL):

(string-trim " 
" "DAVY 
JONES 

")
;=> "DAVY 
;   JONES"

在正则表达式中,你应该使用 \n 作为换行符。

(cl-ppcre:regex-replace-all "(\n|\s*$)" "DAVY 
JONES 

" "")
;=> "DAVY JONES"

使用 (\n|\s*$) 替换所有换行符,以及输入结束前的所有空格。