Можно ли использовать «простую» длинную строку?

В Julia вы не можете хранить такую ​​строку:

str = "\mwe"

Потому что есть обратная косая черта. Таким образом, следующее позволяет вам предотвратить это:

str = "\\mwe"

То же самое происходит с "$, \n" и многими другими символами. У меня такой вопрос, учитывая, что у вас очень длинная строка из тысяч символов и это не очень удобно обрабатывать все разные случаи даже с поиском и заменой (Ctrl+H), есть ли способ назначить ее непосредственно на переменная?

Возможно, следующее (которое я пробовал) дает представление о том, что я хотел бы:

str = """\$$$ \\\nn\nn\m this is a very long and complicated (\n^$" string"""

Здесь """ не подходит, что использовать вместо него?

Подходят ли необработанные строковые литералы (например, raw"...") для вашего варианта использования?

PaSTE 02.02.2023 16:40

@PaSTE, о, отлично! Я не знал об этом :) Спасибо

JKHA 02.02.2023 16:42

Если у вас есть строковые данные длиной в тысячи символов, которые необходимо включить дословно, вы можете подумать о том, чтобы поместить их в файл и прочитать оттуда, а не пытаться цитировать их в исходном файле.

StefanKarpinski 02.02.2023 17:57
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
2
3
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Быстрый ответ: необработанные строковые литералы, такие как raw"\$$$ \\\nn...", помогут вам в этом.

Необработанные строковые литералы позволяют помещать между кавычками практически все, что угодно, и Джулия сохранит символы в том виде, в каком они были введены, без замен, расширений или вставок. Это означает, что вы можете легко делать такие вещи:

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

Проблема всегда заключается в разделителях, которые определяют, где начинается и заканчивается строка. У вас должен быть какой-то способ сообщить Джулии, что включено в строковый литерал, а что нет, и Джулия использует для этого двойные кавычки, а это означает, что если вы хотите использовать двойные кавычки в строковом литерале, вам все равно придется избегать их:

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

Если вас это беспокоит, вы можете комбинировать тройные кавычки с 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

Если вас это беспокоит, вы можете попробовать написать макрос, который избегает этих ограничений, но в конечном итоге вам всегда придется указывать Джулии, где вы хотите начать обработку строкового литерала и где вы хотите закончить обработку строкового литерала, так что вы всегда нужно выбирать какой-то способ отделить строковый литерал от остального кода и избежать этого разделителя внутри строки.

Обновлено: вам не нужно избегать обратной косой черты в необработанных строковых литералах, чтобы включать кавычки в строку, вам просто нужно избегать кавычек. Но если вам нужна буквальная обратная косая черта, за которой следует буквальная кавычка, вам нужно экранировать обе:

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

Если вы избежите обратной косой черты, а не кавычек, Джулия запутается:

h = raw"\\"quote"
# ERROR: syntax: cannot juxtapose string literal

Это объясняется в оговорке в документации.

`c = raw"\\"quote" ОШИБКА: синтаксис: невозможно сопоставить строковый литерал`

DNF 03.02.2023 09:27

Ты прав. Спасибо, @DNF. Обновлен ответ, чтобы отразить правильное экранирование обратной косой черты и кавычек.

PaSTE 03.02.2023 15:48

Другие вопросы по теме