對於它的價值,我們總是使用TAB進行縮進 - 恕我直言,這是唯一合理的選擇。所以,使用YAML是一個真正的問題。不想修改現有的YAML解析器(不好的事情),我寫了下面的JavaScript函數「untabify」的字符串,其結果可以被送入YAML解析器:
function untabify(str, indent=' ') {
return str.replace(/^(\t*)(\x20*)/gm, function(match, p1, p2) {
// --- Keep track of line numbers, for error messages
if (untabify.hasOwnProperty('lineNumber')) {
++untabify.lineNumber;
}
else {
untabify.lineNumber = 0;
}
// --- It's an error for space characters to appear in indentation
if (p2.length > 0) {
throw "Space character not allowed in indentation on line "
+ untabify.lineNumber;
}
return indent.repeat(p1.length);
});
} // untabify()
有了它,你可以只是這樣做(除了去掉,保持行號的跟蹤代碼,我不知道我怎麼能改善它):
var str = `
---
- StudentName
- StudentCode
- Age
- DateOfBirth
- Gender
-
- lCustomData
- Name
- Value
-
- lRaces
- bPrimaryRace
- Race
- RaceCode
-
- lGoals
- iGoal
- Goal
- BeginDate
- EndDate
-
- lObjectives
- iObjective
- Objective
`;
var lStudentFields = YAML.parse(untabify(str));
,如果你嘗試混合製表符和空格它會拋出一個錯誤在你的縮進中。另外,請注意行號從0開始,但由於我的通常用法與示例中一樣,反向字符串從其開始的位置開始,所以第一個行號0將是從那裏開始的空行,所以'--- '在這個例子中,實際上是1號線。沒有經過高度測試,但非常簡單明瞭 - 使用需要您自擔風險。
你的輸入是否包含一個真正的製表符(並且你寫了「\ t」來形象化它)還是真的包含「\ t」(即反斜槓和t)? – Codo
嗨科多;好的問題 - 我會更新澄清,\ t只是可視化,輸入包含一個真正的製表符 – brent