Come faccio a spezzare una stringa su più righe?

In YAML, ho una stringa che è molto lunga. Voglio tenerla all'interno della vista a 80 colonne (o giù di lì) del mio editor, quindi vorrei spezzare la stringa. Qual è la sintassi per questo?

In altre parole, ho questo:

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

e mi piacerebbe avere questo (o qualcosa del genere):

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

Vorrei usare le virgolette come sopra, così non ho bisogno di fare l'escape di nulla all'interno della stringa.

Ci sono 5 6 NINE (o 63*, dipende da come si conta) modi diversi di scrivere stringhe multilinea in YAML.

TL;DR

  • Di solito, vuoi >:

      chiave: >
        La tua lunga
        stringa qui.
  • Se vuoi che le interruzioni di riga siano conservate come \n nella stringa (per esempio, markdown incorporato con paragrafi), usa |.

      chiave: |
        ### Intestazione
    
        * Pallottola
        * Punti
  • Usa >- o |- invece se non vuoi un'interruzione di riga alla fine.

  • Se hai bisogno di dividere le linee in mezzo alle parole o di digitare letteralmente interruzioni di riga come \n, usa invece i doppi apici:

      chiave: "Antidisestab
       lishmentarianism.\n\nGet on it.\quot;
  • YAML è pazzo.

Block scalar styles (>, |)

Questi permettono caratteri come " e " senza escape, e aggiungono una nuova riga (\n) alla fine della tua stringa.

> Stile piegato rimuove le newline singole all'interno della stringa (ma ne aggiunge una alla fine, e converte le newline doppie in singole):

Key: >
  this is my very very very
  long string

→ `questa è la mia stringa molto molto lunga``.

| Stile letterale trasforma ogni newline all'interno della stringa in un newline letterale, e ne aggiunge uno alla fine:

Key: |
  this is my very very very 
  long string

→ "questa è la mia stringa molto molto lunga".

Ecco la definizione ufficiale dalla YAML Spec 1.2

I contenuti scalari possono essere scritti in notazione a blocchi, usando uno stile letterale (indicato da "|") dove tutte le interruzioni di riga sono significative. In alternativa, possono essere scritti con lo stile piegato (indicato da ">") dove ogni interruzione di riga è piegata in uno spazio a meno che non finisca una riga vuota o una più indentata.

Stili di blocco con indicatore di blocco (>-, |-, >+, |+)

Puoi controllare la gestione della nuova riga finale nella stringa, e qualsiasi riga vuota finale (\n\n) aggiungendo un carattere block chomping indicator:

  • >, |: "clip": mantiene l'avanzamento di riga, rimuove le linee vuote finali.
  • >-, |-: "strip": rimuove l'avanzamento di riga, rimuove le righe vuote finali.
  • >+, |+: "keep": mantiene l'avanzamento di riga, mantiene le righe vuote in coda.

"Flow" stili scalari (`,",'`)

Questi hanno un escaping limitato, e costruiscono una stringa a linea singola senza nuovi caratteri di riga. Possono iniziare sulla stessa linea della chiave, o con ulteriori newline prima.

plain style (nessun escape, nessuna combinazione # o :, limiti sul primo carattere):

Key: this is my very very very 
  long string

double-quoted style (e `"` devono essere sfuggiti da, i newline possono essere inseriti con una sequenza letterale n`, le linee possono essere concatenate senza spazi con ```` di coda):

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

"questa è la mia stringa molto molto molto lunga.\n\nLove, YAML."

stile tra apici singoli (il letterale ' deve essere raddoppiato, nessun carattere speciale, eventualmente utile per esprimere stringhe che iniziano con doppi apici):

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

→ `"questa è la mia stringa molto molto molto lunga, vero?

Riassunto

In questa tabella, _ significa carattere spazio. n` significa "carattere newline" (n` in JavaScript), eccetto per la riga "newlines" in linea, dove significa letteralmente un backslash e una 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       |

Esempi

Notare gli spazi finali sulla linea prima di "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        
  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."
]

Stili di blocco con indicatori di rientro

Nel caso in cui quanto sopra non sia abbastanza per te, puoi aggiungere un "indicatore di indentazione del blocco" (dopo il tuo indicatore di indentazione del blocco, se ne hai uno):

- >8
        My long string
        starts over here
- |+1
 This one
 starts here

Addendum

Se si inseriscono spazi extra all'inizio delle linee non iniziali nello stile Folded, questi verranno mantenuti, con un newline in più. Questo non succede con gli stili di flusso:

- >
    my long
      string
- my long
    string

["mia stringa lunga", "mia stringa lunga"]

Non posso nemmeno.

*2 stili di blocco, ciascuno con 2 possibili indicatori di blocco (o nessuno), e con 9 possibili indicatori di rientro (o nessuno), 1 stile semplice e 2 stili quotati: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63

Alcune di queste informazioni sono state anche riassunte qui.

Commentari (26)
Soluzione

Usando lo stile piegato yaml, ogni interruzione di riga è sostituita da uno spazio. L'indentazione in ogni linea sarà ignorata. Un'interruzione di riga sarà inserita alla fine.

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

Potete usare l'indicatore "block chomping indicator" per eliminare l'interruzione di riga finale, come segue:

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.

Ci sono anche altri strumenti di controllo disponibili (per controllare l'indentazione, per esempio).

Vedi https://yaml-multiline.info/

Commentari (11)

Per preservare le newlines usate |, per esempio:

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

è tradotto in "Questa è una frase molto lunga\n che si estende su diverse righe nello YAML\n ma che sarà resa come una stringa\n con le newlines preservate.\n"

Commentari (12)