2017-09-05 51 views
2

請注意,這個問題是類似像this one,但仍然是不同的,這樣這些問題的答案將不解決我的問題:如何在多行中打斷一個字符串並在YAML中保留空格?

  • 對於像例如控制字符插入\x08,似乎我不得不用雙引號"
  • 所有空間需要保持完全按照給定。對於換行符,我明確使用\n

我有我需要在YAML來存儲一些字符串數據,例如:

  • " This is my quite long string data "
  • "This is my quite long string data"
  • "This_is_my_quite_long_string_data"
  • "Sting data\nwhich\x08contains control characters"

,需要它YAML作爲一些東西像這樣:

Key: " This is my" + 
    " quite long " + 
    " string data " 

這是沒有問題的,只要我留在同一行,但我不知道如何把字符串內容爲多行。

YAML塊標樣式(>|)將不會在這裏幫助,因爲他們不允許逃跑,他們甚至做一些空白剝離,換行/空間取代了是沒有用我的情況。

看來,只有這樣,好像是用雙引號"和反斜線\,像這樣:

Key: "\ 
    This is \ 
    my quite \ 
    long string data\ 
    " 

如預期YAML online parser結果"This is my quite long string data"嘗試這個。

但是,如果「亞行」之一,擁有領先的空間,這樣它不幸失敗:

Key: "\ 
    This is \ 
    my quite\ 
    long st\ 
    ring data\ 
    " 

這導致"This is my quitelong string data",去掉的話quite和這個例子的long之間的空間。這使我的頭腦解決的唯一的事情,是\x20這樣來代替每個子行的第一個前導空格:

Key: "\ 
    This is \ 
    my quite\ 
    \x20long st\ 
    ring data\ 
    " 

至於我會選擇YAML有一個最佳的人類可讀的格式,我覺得\x20有點難看的解決方案。也許有人知道更好的方法?

爲了保持人類的可讀性,我也不希望爲此使用!!binary

+1

你能想出一個標題和第一段,使其更明確爲什麼這不是你鏈接到的現有問題的重複?特別是,對於你的情況,什麼是特殊的,[最廣泛的答案](https://stackoverflow.com/a/21699210/157957)中的技術都不適用?我想可能你的實際問題是「如何保留多行字符串中的前導空格?」或類似的東西。 – IMSoP

+0

完成。將對其他問題的引用移至第一段,並在標題中插入「保留空格」。 – Joe

回答

1

相反的\x20,你可以簡單地逃脫就行的第一個非縮進空間:

Key: "\ 
    This is \ 
    my quite\ 
    \ long st\ 
    ring data\ 
    " 

這適用於多個空格,你只需要逃跑的第一個。

1

你的觀察是正確的,即控制字符只能用雙引號標量表示。

但是解析器不會失敗如果子行(在YAML中說:連續行)有一個前導空格。這是您對YAML標準的解釋不正確。該標準明確規定對於多行double quoted scalars

從內容中排除所有前導和尾隨空白字符。

因此,您可以根據需要在long之前放置儘可能多的空間,這不會有什麼區別。

Python的雙引號標量的代表(包括ruamel.yaml和PyYAML)總是代表換行符\n。我不知道其他語言的YAML代表,您可以更好地控制它(例如,在您的雙引號標量中獲得雙重換行符來代表\n)。所以你可能必須寫你自己的代表。

在寫一個代表的時候,你可以嘗試使斷行變得聰明,因爲它可以最小化逃逸空間的數量(通過將它們放在同一行上的單詞之間)。 但是特別是對於雙倍空間與字比高的字符串,加上一個小寬度來操作,在沒有空間的情況下很難(如果不是不可能的話)完成。

IMO應首先檢查是否需要雙引號(即除換行符外還有控制字符)。如果不是,並且有換行符,則可能更適合將字符串表示爲塊樣式文字標量(不排除行首或末尾的空格)。

+0

我認爲你對「失敗」這個詞有過分的解釋。從問題的下一句話中可以清楚地看出,它僅僅意味着「未能給出期望的結果」 - 具體而言,它在示例中未能保持「相當」和「長期」之間的空間。在YAML規範的問題中沒有提到,只是嘗試了一些樣本輸入而沒有得到期望的結果,因此規範證實了OP已經知道的領先空間的事實是非常不相關的。 – IMSoP

相關問題