我在覆盆子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 answer和CLHS,但仍然无法理解为什么(#\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。
答案 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*$)
替换所有换行符,以及输入结束前的所有空格。