String 字符串修剪和cl ppcre无法修剪#\Newline

String 字符串修剪和cl ppcre无法修剪#\Newline,string,common-lisp,newline,String,Common Lisp,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/&quo

我在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)
我仔细阅读了一遍,但仍然无法理解为什么
字符串修剪
不能用
\newline
\linefeed
\return
来修剪任何东西,以及

(cl ppcre:regex替换“#\Newline”(查询“…语句…”)”)
(cl ppcre:regex replace#\Newline(查询“…语句…”)”)

也不起作用,而

(cl-ppcre:split #\Newline (query "...statement..."))
成功地将列拆分为类似
(“DAVY”“JONES”)
的列表

编辑 我注意到上面用“\code>”删除的代码“\Newline”显然造成了一种混乱,我可能将字符串修剪称为“\Newline”,但这是一种打字错误

调用
(cl-ppcre:regex-replace
\newline
…)
(string-trim'(#\newline)…)
都无法摆脱#\newline.
实际上,我可以通过调用
(cl-ppcre:split#\Newline
)来处理我的工作,在某些情况下,我甚至更愿意这样做

但是,我想理解为什么使用
“(#\Newline)
调用string trim会修剪字符串末尾的#\Newline,但不能修剪单词之间的#\Newline

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

正如Renzo在评论中提到的,您可以将要修剪的字符作为列表而不是字符串

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

")
;=> "DAVY 
;   JONES"
您也可以只在字符串中写换行符,尽管这看起来很难看(您也可以使用):

在正则表达式中,应该对换行符使用
\n

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

" "")
;=> "DAVY JONES"
使用
(\n |\s*$)
替换所有换行符以及输入结束前的所有空白

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

正如Renzo在评论中提到的,您可以将要修剪的字符作为列表而不是字符串

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

")
;=> "DAVY 
;   JONES"
您也可以只在字符串中写换行符,尽管这看起来很难看(您也可以使用):

在正则表达式中,应该对换行符使用
\n

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

" "")
;=> "DAVY JONES"

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

哪个
字符串修剪调用对您不起作用?例如,在Mac上的CCL中,
(字符串修剪“(#\Space#\Newline)字符串)
工作正常。@Renzo我已经尝试了一个更广泛的列表。没有提及它是为了不让问题变得混乱哪个调用
字符串修剪
对你不起作用?例如,在Mac上的CCL中,
(字符串修剪“(#\Space\Newline)字符串)
工作正常。@Renzo我已经尝试了一个更广泛的列表。没有提及它是为了不让问题变得混乱。请查看我的编辑,调用cl-ppcre:regex替换为“#\Newline”是一个输入错误。我想了解为什么调用
字符串修剪
时使用
”(#\Newline)
可以修剪字符串末尾的
\Newline
s,但不能修剪单词之间的
\Newline
s。@barerd
string-trim
仅从开头和结尾修剪。hyperspec描述中的第一句话:“string trim返回字符串的子字符串,字符包中的所有字符都从开头和结尾剥离。”。您只需使用
(删除#\newline string)
如果你想删除所有的换行符。显然,我没有仔细阅读CLHS。我很抱歉。请参阅我的编辑,调用cl ppcre:regex replace with“#\Newline”是一个打字错误。我想了解为什么调用
字符串修剪
with
”(#\Newline)
可以修剪字符串末尾的
\Newline
s,但不能修剪单词之间的
\Newline
s。@barerd
string-trim
仅从开头和结尾修剪。hyperspec描述中的第一句话:string trim返回字符串的子字符串,其中字符包中的所有字符都从开头和结尾剥离。“。如果要删除所有换行符,您应该使用
(remove#\newline string)
。显然,我没有彻底阅读CLH。我很抱歉。