是否可以使用“普通”长字符串?

JKH*_*KHA 2 string text escaping julia

在 Julia 中,你不能存储这样的字符串:

str = "\mwe"
Run Code Online (Sandbox Code Playgroud)

因为有一个反斜杠。因此,以下内容可以帮助您防止这种情况发生:

str = "\\mwe"
Run Code Online (Sandbox Code Playgroud)

"$, \n"和许多其他符号也会发生同样的情况。我的问题是,鉴于您有一个包含数千个字符的极长字符串,即使使用搜索和替换(Ctrl + H),处理所有不同的情况也不是很方便,有没有办法将其直接分配给多变的?

也许以下内容(我尝试过)给出了我想要的想法:

str = """\$$$ \\\nn\nn\m this is a very long and complicated (\n^$" string"""
Run Code Online (Sandbox Code Playgroud)

这里"""不适合,我应该用什么来代替?

PaS*_*STE 5

快速回答:像这样的原始字符串文字raw"\$$$ \\\nn..."将帮助您完成大部分工作。

原始字符串文字允许您在引号之间放置几乎任何您喜欢的内容,并且 Julia 将保持输入的字符,而不进行替换、扩展或插值。这意味着您可以轻松地完成此类操作:

a = raw"\mwe"
@assert codepoint(a[1]) == 0x5c  # Unicode point for backslash

b = raw"$(a)"
@assert codepoint(b[1]) == 0x25  # Unicode point for dollar symbol
Run Code Online (Sandbox Code Playgroud)

问题始终是定义字符串开始和结束位置的分隔符。你必须有某种方式告诉 Julia 字符串文字中包含什么,不包含什么,Julia 使用双引号来做到这一点,这意味着如果你想在字符串文字中使用双引号,你仍然必须转义这些:

c = raw"\"quote"  # note the backslashe
@assert codepoint(c[1]) == 0x22  # Unicode point for double quote marks
Run Code Online (Sandbox Code Playgroud)

如果这让您烦恼,您可以将三引号与 结合起来raw,但是如果您想在字符串中表示文字三引号,您仍然必须转义这些

d = raw""""quote"""  # the three quotes at the beginning and three at the end delimit the string, the fourth is read literally
@assert codepoint(d[1]) == 0x22  # Unicode point for double quote marks

e = raw"""\"\"\"""" # In triple quoted strings, you do not need to escape the backslash
@assert codeunits(e) == [0x22, 0x22, 0x22]  # Three Unicode double quote marks
Run Code Online (Sandbox Code Playgroud)

如果这让您烦恼,您可以尝试编写一个宏来避免这些限制,但是您最终总是必须告诉 Julia 您想要在哪里开始处理字符串文字以及您想要在哪里结束处理字符串文字,因此您将总是必须选择某种方法来将字符串文字与代码的其余部分分隔开来,并在字符串中转义该分隔符。

编辑:您不需要转义原始字符串文字中的反斜杠即可在字符串中包含引号,只需转义引号即可。但是,如果您想要一个反斜杠后跟一个引号,则必须将两者都转义:

f = raw"\"quote"
@assert codepoint(f[1]) == 0x22  # double quote marks

g = raw"\\\"quote"  # note the three backslashes
@assert codepoint(g[1]) == 0x5c  # backslash
@assert codepoint(g[2]) == 0x22  # double quote marks
Run Code Online (Sandbox Code Playgroud)

如果您转义反斜杠而不是引号,Julia 会感到困惑:

h = raw"\\"quote"
# ERROR: syntax: cannot juxtapose string literal
Run Code Online (Sandbox Code Playgroud)

文档中的警告对此进行了解释。