Как разбить строку на несколько строк? - PullRequest
1276 голосов
/ 24 сентября 2010

В YAML у меня есть очень длинная строка.Я хочу сохранить это в 80-колоночном (или около того) виде моего редактора, поэтому я хотел бы разбить строку.Какой синтаксис для этого?

Другими словами, у меня есть это:

Key: 'this is my very very very very very very long string'

, и я хотел бы иметь это (или что-то на этот счет):

Key: 'this is my very very very ' +
     'long string'

Я хотел бы использовать кавычки, как указано выше, поэтому мне не нужно ничего экранировать в строке.

Ответы [ 9 ]

2900 голосов
/ 11 февраля 2014

Существует 5 6 NINE (или 63 *, в зависимости от того, как вы считаете) писать многострочные строки в YAML.

TL; DR

  • Обычно вы хотите >:

    key: >
      Your long
      string here.
    
  • Если вы хотите, чтобы разрывы строк сохранялись как \n в строке (например, встроенная уценка с абзацами), используйте |.

    key: |
      ### Heading
    
      * Bullet
      * Points
    
  • Используйте вместо этого >- или |-, если вы не хотите, чтобы в конце добавлялся перенос строки.

  • Если вам нужно разбить строки в середине слов или буквально ввести разрывы строк как \n, используйте вместо этого двойные кавычки:

    key: "Antidisestab\
     lishmentarianism.\n\nGet on it."
    
  • ЯМЛ сумасшедший.

Блочные скалярные стили (>, |)

Они позволяют символы, такие как \ и " без экранирования, и добавляют новую строку (\n) в конец вашей строки.

> Сложенный стиль удаляет одиночные новые строки в строке (но добавляет один в конце и преобразует двойные новые строки в одиночные):

Key: >
  this is my very very very
  long string

this is my very very very long string\n

| Литеральный стиль превращает каждую новую строку в строке в буквальную новую строку и добавляет один в конце:

Key: |
  this is my very very very 
  long string

this is my very very very\nlong string\n

Вот официальное определение из YAML Spec 1.2

Скалярное содержимое может быть записано в блочной нотации, используя буквальный стиль (обозначенный «|»), где все разрывы строк являются значительными. В качестве альтернативы они могут быть записаны в сложенном стиле (обозначаемом «>»), где каждый разрыв строки свернут в пробел, если он не заканчивается пустой или более отступой строкой.

Стили блоков с индикатором чипирования блоков (>-, |-, >+, |+)

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

  • >, |: "clip": сохранить перевод строки, удалить завершающие пустые строки.
  • >-, |-: «полоса»: убрать перевод строки, убрать завершающие пустые строки.
  • >+, |+: "keep": сохранить перевод строки, оставить после себя пустые строки.

Скалярные стили "Flow" (, ", ')

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

простой стиль (без экранирования, без комбинаций # или :, ограничения по первому символу):

Key: this is my very very very 
  long string

стиль в двойных кавычках (\ и " должны быть экранированы \, символы новой строки могут вставляться с буквенной последовательностью \n, строки могут быть объединены без пробелов с конечным знаком \):

Key: "this is my very very \"very\" loooo\
  ng string.\n\nLove, YAML."

& rarr; "this is my very very \"very\" loooong string.\n\nLove, YAML."

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

Key: 'this is my very very "very"
  long string, isn''t it.'

& rarr; "this is my very very \"very\" long string, isn't it."

Краткое описание

В этой таблице _ означает space character. \n означает «символ новой строки» (\n в JavaScript), за исключением строки «встроенные символы новой строки», где это означает буквально обратную косую черту и n).

                      >     |            "     '     >-     >+     |-     |+
-------------------------|------|-----|-----|-----|------|------|------|------  
Trailing spaces   | Kept | Kept |     |     |     | Kept | Kept | Kept | Kept
Single newline => | _    | \n   | _   | _   | _   | _    |  _   | \n   | \n
Double newline => | \n   | \n\n | \n  | \n  | \n  | \n   |  \n  | \n\n | \n\n
Final newline  => | \n   | \n   |     |     |     |      |  \n  |      | \n
Final dbl nl's => |      |      |     |     |     |      | Kept |      | Kept  
In-line newlines  | No   | No   | No  | \n  | No  | No   | No   | No   | No
Spaceless newlines| No   | No   | No  | \   | No  | No   | No   | No   | No 
Single quote      | '    | '    | '   | '   | ''  | '    | '    | '    | '
Double quote      | "    | "    | "   | \"  | "   | "    | "    | "    | "
Backslash         | \    | \    | \   | \\  | \   | \    | \    | \    | \
" #", ": "        | Ok   | Ok   | No  | Ok  | Ok  | Ok   | Ok   | Ok   | Ok
Can start on same | No   | No   | Yes | Yes | Yes | No   | No   | No   | No
line as key       |

Примеры * +1161 * Запишите пробелы в конце строки перед "пробелами". - > very "long" 'string' with paragraph gap, \n and spaces. - | very "long" 'string' with paragraph gap, \n and spaces. - very "long" 'string' with paragraph gap, \n and spaces. - "very \"long\" 'string' with paragraph gap, \n and s\ p\ a\ c\ e\ s." - 'very "long" ''string'' with paragraph gap, \n and spaces.' - >- very "long" 'string' with paragraph gap, \n and spaces. [ "very \"long\" 'string' with\nparagraph gap, \\n and spaces.\n", "very \"long\"\n'string' with\n\nparagraph gap, \\n and \nspaces.\n", "very \"long\" 'string' with\nparagraph gap, \\n and spaces.", "very \"long\" 'string' with\nparagraph gap, \n and spaces.", "very \"long\" 'string' with\nparagraph gap, \\n and spaces.", "very \"long\" 'string' with\nparagraph gap, \\n and spaces." ] Стили блоков с индикаторами отступа На всякий случай, если вам недостаточно вышеприведенного, вы можете добавить « индикатор отступа блока » (после индикатора блокировки блока, если он у вас есть): - >8 My long string starts over here - |+1 This one starts here Добавление Если вы вставите лишние пробелы в начале не первых строк в сложенном стиле, они будут сохранены с бонусной новой строкой. Этого не происходит со стилями потока: - > my long string - my long string ["my long\n string\n", "my long string"] Не могу даже. * 2 стилевых блока, каждый с 2-мя возможными индикаторами сочетания блоков (или без) и с 9-ю возможными индикаторами отступа (или без), 1 простой стиль и 2 указанных стиля: 2 x (2 + 1) x (9 + 1)+ 1 + 2 = 63 Часть этой информации также была обобщена здесь .

761 голосов
/ 24 сентября 2010

Используя стиль сгиба yaml, каждый разрыв строки заменяется пробелом. Отступ в каждой строке будет игнорироваться. В конце будет вставлен разрыв строки.

Key: >
  This is a very long sentence
  that spans several lines in the YAML
  but which will be rendered as a string
  with only a single carriage return appended to the end.

http://symfony.com/doc/current/components/yaml/yaml_format.html

Вы можете использовать «индикатор блокады», чтобы устранить разрыв в трейлинговой линии, следующим образом:

Key: >-
  This is a very long sentence
  that spans several lines in the YAML
  but which will be rendered as a string
  with NO carriage returns.

Также доступны другие инструменты управления (например, для управления отступами).

См. https://yaml -multiline.info /

176 голосов
/ 12 марта 2013

Чтобы сохранить переводы строки , используйте |, например:

|
  This is a very long sentence
  that spans several lines in the YAML
  but which will be rendered as a string
  with newlines preserved.

переводится как «Это очень длинное предложение‌ \ n, который занимает несколько строк в YAML‌ \ n , но который будет отображаться как строка‌ \ n с сохранением новых строк. \ n"

69 голосов
/ 06 апреля 2018

1. Нотация блока: Новые строки становятся пробелами, а дополнительные строки после удаления блока

---
# Note: It has 1 new line after the string
content:
    Arbitrary free text
    over multiple lines stopping
    after indentation changes...

...

Эквивалент JSON

{
 "content": "Arbitrary free text over multiple lines stopping after indentation changes..."
}

2. Скаляр Literal Block: Скаляр Literal Block | будет включать переводы строки и любые пробелы в конце. но удаляет лишние

переводы строк после блока.

---
# After string we have 2 spaces and 2 new lines
content1: |
 Arbitrary free text
 over "multiple lines" stopping
 after indentation changes...  


...

Эквивалент JSON

{
 "content1": "Arbitrary free text\nover \"multiple lines\" stopping\nafter indentation changes...  \n"
}

3. + индикатор с литеральным скалярным блоком: сохранить дополнительные символы новой строки после блока

---
# After string we have 2 new lines
plain: |+
 This unquoted scalar
 spans many lines.


...

Эквивалент JSON

{
 "plain": "This unquoted scalar\nspans many lines.\n\n\n"
}

4. - индикатор с литеральным скалярным блоком: - означает, что новая строка в конце строки удалена.

---
# After string we have 2 new lines
plain: |-
 This unquoted scalar
 spans many lines.


...

Эквивалент JSON

{
 "plain": "This unquoted scalar\nspans many lines."
}

5. Скаляр сложенного блока (>):

сворачивает новые строки в пробелы, но удаляет лишние новые строки после блока.

---
folded_newlines: >
 this is really a
 single line of text
 despite appearances


...

Эквивалент JSON

{
 "fold_newlines": "this is really a single line of text despite appearances\n"
}

для получения дополнительной информации вы можете посетить мой блог

39 голосов
/ 25 октября 2014

Вы можете не верить этому, но YAML также может выполнять многострочные ключи:

?
 >
 multi
 line
 key
:
  value
35 голосов
/ 11 апреля 2017

Чтобы объединить длинные строки без пробелов , используйте двойные кавычки и экранируйте символы новой строки с обратной косой чертой:

key: "Loremipsumdolorsitamet,consecteturadipiscingelit,seddoeiusmodtemp\
  orincididuntutlaboreetdoloremagnaaliqua."

(Спасибо @Tobia)

16 голосов
/ 06 мая 2015

Если вы используете yml и Twig для переводов в Symfony и хотите использовать многострочные переводы в Javascript, сразу после перевода добавляется возврат каретки. Так что даже следующий код:

var javascriptVariable = "{{- 'key'|trans -}}";

Который имеет следующий перевод yml:

key: >
    This is a
    multi line 
    translation.

Все равно приведёт к следующему коду в html:

var javascriptVariable = "This is a multi line translation.
";

Итак, знак минуса в Twig не решает эту проблему. Решение состоит в том, чтобы добавить этот знак минус после знака больше, чем yml:

key: >-
    This is a
    multi line 
    translation.

Будет иметь правильный результат, многострочный перевод в одну строку в Twig:

var javascriptVariable = "This is a multi line translation.";
8 голосов
/ 06 сентября 2017

Для ситуаций, когда строка может содержать пробелы или нет, я предпочитаю двойные кавычки и продолжение строки с обратной косой чертой:

key: "String \
  with long c\
  ontent"

Но обратите внимание на ловушку для случая, когда строка продолжения начинается с пробела,его нужно экранировать (потому что он будет удален в другом месте):

key: "String\
  \ with lon\
  g content"

Если строка содержит разрывы строк, это должно быть написано в стиле C \n.

См.также этот вопрос .

0 голосов
/ 07 апреля 2019

Ни одно из перечисленных выше решений не сработало для меня в файле YAML в проекте Jekyll. Перепробовав много вариантов, я понял, что HTML-инъекция с <br> тоже может сработать, поскольку в итоге все отображается в HTML:

имя: | В деревне Ла-Манча <br>, имя которой я не <br> хочу запомнить.

По крайней мере, у меня это работает. Без понятия о проблемах, связанных с этим подходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...