string-trim和cl-ppcre无法修剪#\ Newline

时间:2016-06-21 22:21:45

标签: string common-lisp newline

我在覆盆子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分隔,而字符串的末尾包含一个#\和两个{{ 1}}字符:

#\Newline

我彻底阅读了this answerCLHS,但仍然无法理解为什么(#\D #\A #\V #\Y #\ #\Newline #\J #\O #\N #\E #\S #\ #\Newline #\Newline) 无法使用string-trim#\newline#\linefeed修剪任何内容,和

(cl-ppcre:regex-replace“#\ Newline”(查询“...声明......”)“”)
    (cl-ppcre:regex-replace#\ Newline(查询“... statement ...”)“”)

也不起作用,而

#\return

成功将列拆分为(cl-ppcre:split #\Newline (query "...statement...")) 等列表。

修改

我注意到上面带有("DAVY " "JONES ")的strikethroughed代码显然引起了一种混乱,我可能用“#\ Newline”称为字符串修剪,但这是一个错字。

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

但是,我想理解为什么调用带有(cl-ppcre:split #\Newline的字符串修剪修剪字符串末尾的#\ Newlines,但不能修剪单词之间的#\ Newlines。

1 个答案:

答案 0 :(得分:2)

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

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

正如Renzo在评论中提到的那样,您可以将STRING-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*$)替换所有换行符,以及输入结束前的所有空格。