如何在 Julia 中替换字符串文字 back/front 斜杠?

How to replace string literals back/front slashes in Julia?

在 Python 中,我可以这样替换斜杠的字符串:

>>> s = 'ab\c'
>>> s.replace('\', '\\')
'ab\\c'
>>> print s.replace('\', '\\')
ab\c

在 Julia,我什么时候可以做到这一点:

julia> s = "ab\c"
"ab\c"

julia> replace(s, "\\", "\\\\")
"ab\c"

我已经试过了,但它会抛出一些语法错误:

julia> replace(s, r"\", r"\")
ERROR: syntax: "\" is not a unary operator

Julia REPL 以 escaped 形式输出字符串。最好用 println 包裹东西,如 println(replace(s, "\", "\\"))。在这种情况下你得到:

julia> s = "ab\c"
"ab\c"

julia> println(s)
ab\c

julia> println(replace(s, "\", "\\"))
ab\c

关于正则表达式的使用,第一个 r"\" 是部分正则表达式,解析器继续并在结束 " 之后在随后的 \ 上生成错误,并且第二个正则表达式是不必要的,因为它是要插入的字符串。

更新:关于 Julia 与 Python 在另一个答案中转义的更多细节。

希望对您有所帮助!

这里有两个混淆来源,其中之一是 Dan 提到的打印与 REPL 输出问题。然而,混淆的根本原因似乎是字符串文字在 Julia 和 Python:

中具有不同的转义行为
  • 在 Julia 中,字符串文字中的 \ 总是 转义下一个字符——单个反斜杠永远不会产生文字反斜杠,它总是与以下字符组合。如果后面的字符作为转义没有特殊意义,那么后面的字符是自己产生的,结果字符串中没有反斜杠。这里就是这种情况:以 c 开头的转义没有特殊意义,因此 "ab\c""abc".

  • 相同
  • 在Python中,字符串文字中的\有时转义下一个字符,但如果后面的字符有没有特殊含义,那么它不会引入转义,因此序列会产生文字反斜杠以及后面的内容。在这种情况下,'ab\c'"ab\c" 都等于 "ab\c"(第二个反斜杠被第一个反斜杠转义,产生单个文字反斜杠)。

请注意,两个反斜杠形式是 Python 提示将字符串打印回给您的方式 - 这是编写此字符串的标准方式,正确转义,而不是依赖 c 作为转义字符没有特殊含义。如果反斜杠后面跟着一些其他具有特殊含义的字符作为转义符(请参见下面的示例),那么输入字符串将完全不同。

这里有一些例子 Python:

>>> [c for c in "ab\c"]
['a', 'b', '\', 'c']

>>> [c for c in "ab\c"]
['a', 'b', '\', 'c']

>>> [c for c in "a\bc"]
['a', '\x08', 'c']

>>> [c for c in "a\bc"]
['a', '\', 'b', 'c']

>>> [c for c in "\abc"]
['\x07', 'b', 'c']

>>> [c for c in "\abc"]
['\', 'a', 'b', 'c']

以下是 Julia 中的类似示例:

julia> [c for c in "ab\c"]
3-element Array{Char,1}:
 'a'
 'b'
 'c'

julia> [c for c in "ab\c"]
4-element Array{Char,1}:
 'a'
 'b'
 '\'
 'c'

julia> [c for c in "a\bc"]
3-element Array{Char,1}:
 'a'
 '\b'
 'c'

julia> [c for c in "a\bc"]
4-element Array{Char,1}:
 'a'
 '\'
 'b'
 'c'

julia> [c for c in "\abc"]
3-element Array{Char,1}:
 '\a'
 'b'
 'c'

julia> [c for c in "\abc"]
4-element Array{Char,1}:
 '\'
 'a'
 'b'
 'c'

转义符 \a\b 在两种语言中都有特殊含义——它们对每种语言的 ASCII "bell" 和 "backspace" 字符进行编码。区别在于序列 \c:在 Julia 中,它只编码字符 c,而在 Python 中,它编码两个字符——反斜杠和 c——因为 c碰巧没有作为逃避的特殊意义。 Julia 的字符串转义规则与 C、C++、Java、Perl 和 Ruby 非常相似,并且是从它们派生而来的。我不确定 Python 的字符串转义行为的来源是什么。

更新: 字符串文字中的无效转义将在 Julia 的未来版本中成为语法错误 (issue #21284) and Python (3.6 release notes)。这使 Julia 和 Python 转义字符串文字的行为达成一致。