【问题标题】:How to distinguish escaped characters from non-escaped e.g. "\x27" from "x27" in a string in Common Lisp?如何区分转义字符和非转义字符,例如Common Lisp中字符串中的“x27”中的“\x27”?
【发布时间】:2022-01-01 20:20:20
【问题描述】:
解决Advent of Code 2015 task 8 part2 我遇到了必须区分字符串中出现的“\x27”和普通“x27”的问题。
但我没有办法做到这一点。因为
(length "\x27") ;; is 3
(length "x27") ;; is also 3
(subseq "\x27" 0 1) ;; is "x"
(subseq "x27" 0 1) ;; is "x"
print、prin1、princ 都没有影响。
# nor does `coerce`
(coerce "\x27" 'list)
;; (#\x #\2 #\7)
那么如何在字符串中区分 "\x27" 或任何此类
出现十六进制表示?
- 事实证明,解决任务不需要解决这个问题。但是,现在我还是想知道在 common lisp 中是否有办法区分 "\x" 和 "x"。
【问题讨论】:
标签:
string
hex
escaping
common-lisp
【解决方案1】:
当 Lisp 阅读器开始工作时,\x 与 x 相同。可能有一些方法可以关闭它 - 我不会感到惊讶 - 但原始文本谈到了圣诞老人的文件。
所以,我创建了自己的文件,如下所示:
x27
\x27
然后我将数据读入这样的特殊变量中:
(defun read-line-crlf (stream)
(string-right-trim '(#\Return) (read-line stream nil)))
(defun read-lines (filename)
(with-open-file (stream filename)
(setf x (read-line-crlf stream))
(setf x-esc (read-line-crlf stream))
))
那么x的长度是3,x-esc的长度是4。返回的字符串必须在Windows上修剪,或者声明一个外部格式,否则SBCL会留下一半的CR-LF读取字符串的结尾。
【解决方案2】:
字符串文字"\x27" 与"x27" 读取相同,因为\ 是字符串文字中的转义字符。如果您想要一个内容为\x27 的字符串,则需要将文字写为"\\x27"(即转义转义字符)。这与字符串本身无关。如果从包含\x27 的文件中读取字符串(例如read-line),则结果为四字符字符串\x27。