如何在Emacs Lisp中将字符串中的正斜杠替换为反斜杠?

10
我可以帮您将emacs lisp中的正斜杠替换为反斜杠。 如果我使用以下代码:

(replace-regexp-in-string "\/" "\\" path))

我遇到了一个错误。
(error "Invalid use of `\\' in replacement text")

那么如何在第二个正则表达式中表示反斜杠?
4个回答

14

你在"C:\\foo\\bar"中看到的是字符串"C:\foo\bar"的文本表示形式,其中反斜杠被转义以便进行进一步处理。

例如,如果您使用反斜杠字符创建长度为1的字符串:

(make-string 1 ?\\)

您执行C-x C-e后,将在minibuffer中看到以下响应:
"\\"

另一种获取你想要的方式是打开“literal”标志:

(replace-regexp-in-string "/" "\\" path t t)

顺便说一下,你不需要转义斜杠。


6

需要进行双重转义吗?

(replace-regexp-in-string "\/" "\\\\" path)

是的 :-) 但这是一个语法错误(最后一个引号被转义了) - Peter
另一个想法 - 这不需要是一个正则表达式替换,因为它是一个直接的替换 - Emacs/Lisp 是否提供了非正则表达式替换? - Peter Boughton
7
双重转义,即四个连续的反斜杠是有效的。 你看到结果中有两个连续的反斜杠是因为它们在字符串中被转义了。如果你尝试再次输出字符串,它会显示正确。 - Lars Haugseth
2
你还可以这样写以提高可读性:(replace-regexp-in-string "/" (regexp-quote "\") path) - Lars Haugseth

2
尝试使用regexp-quote函数,如下所示:
(replace-regexp-in-string "/" (regexp-quote "\\") "this/is//a/test")
regexp-quote的文档如下:
(regexp-quote string) 返回一个与字符串完全匹配且仅匹配该字符串的正则表达式字符串。

不想泼你冷水,但这个答案已经在第二个回答的评论中给出了。 - seth
哎呀,错过了。谢谢。 - jlf

0

不要使用emacs,但我猜它支持通过\x指定unicode的某种形式

例如,也许这样可以工作

(replace-regexp-in-string "\x005c" "\x005f" path))

或者

(replace-regexp-in-string "\u005c" "\u005f" path))

嗯,那么切换到 \u005c 和 \u005f?不是吗? - jitter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接