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*$)
替换所有换行符,以及输入结束前的所有空格。
我在 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*$)
替换所有换行符,以及输入结束前的所有空格。