【问题标题】:string-trim and cl-ppcre cannot trim #\Newlinestring-trim 和 cl-ppcre 不能修剪 #\Newline
【发布时间】:2016-06-21 22:21:44
【问题描述】:

我在树莓派(机器类型 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 answerCLHS,但仍然无法理解为什么string-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" 显然引起了混淆,我可能将字符串修剪称为“#\Newline”,但这是一个错字。

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

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

【问题讨论】:

  • string-trim 的哪个电话不适合您?例如,在 Mac 上的 CCL 中,(string-trim '(#\Space #\Newline) string) 可以正常工作。
  • @Renzo 我已经尝试了更广泛的列表。没有提到它以免使问题混乱

标签: string common-lisp newline


【解决方案1】:
(cl-ppcre:regex-replace "#\Newline" (query "...statement...") "")

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

正如 Renzo 在 cmets 中提到的,您可以将要修剪的字符作为列表而不是字符串提供 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*$) 替换所有换行符,以及输入结束前的所有空格。

【讨论】:

  • 请看我的编辑,用“#\Newline”调用 c​​l-ppcre:regex-replace 是一个错字。我想了解为什么用'(#\Newline) 调用string-trim 可以修剪字符串末尾的#\Newlines,但不能修剪单词之间的#\Newlines。
  • @barerd STRING-TRIM 只从头到尾修剪。 hyperspec 描述中的第一句话:“string-trim 返回字符串的子字符串,字符包中的所有字符都从开头和结尾剥离。”。如果你想在所有地方删除所有换行符,你应该只使用(remove #\newline string)
  • 好吧,显然,我没有仔细阅读 CLHS。我很抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
相关资源
最近更新 更多