[英]Insert string on every level of braces within a string
我想知道是否有人可以幫助我使用一種算法(在 JS 中)來幫助插入一個字符串,在這種情況下,將“id”插入另一個字符串中的每一級括號。 例如,如果我有以下字符串:
"{id name sub1 { attr sub2 { val key code } id } suba { val key subb { subc { key} } } }"
我想將其轉換為:
"{id name sub1 { attr sub2 { val key code } id } suba { id val key subb { id subc { id key} } } }"
轉換后,每一級括號都有一個 id 字段。
請詢問是否需要任何澄清。 謝謝!
編輯:哎呀:對不起,我忘了添加一個重要的規定,如果括號內的子集已經定義了“代碼”值。 那么我們不應該向該級別/子集添加 id。 這可以在上面的結果中看到,其中 sub2 在轉換結果中沒有id
字段。
除了不想要已經有代碼的 id 之外,ID 字段的 position 在括號內並不重要,只要它們不在左括號和左括號之前的單詞之間。 又名:這種轉換不會很好:
{name sub { val key}} --> {name sub id { val key id}}
您可以使用基於堆棧的算法方法來解決此問題。 請找到以下代碼來解決這個問題。
function addId(str) { let stack = []; let word = ""; let newString = ""; for (let i = 0; i < str.length; i++) { let char = str[i]; if (char === " ") word = ""; else if (char === "{") stack.push({ found: false }); else if (char === "}") { let popChar = stack.pop(); if (popChar["found"] === false) char = (str[i - 1] === " "? "id ": " id ") + char; } else { word += char; if (word === "id" || word === "code") stack[stack.length - 1]["found"] = true; } newString += char; } return newString; } const a = "{ name sub1 { attr sub2 { val key code } } suba { val key subb { subc { key} } } }" const newA = addId(a) console.log(newA)
編輯:在 OP 添加以下條件之前,此答案是可以的:僅將缺少的
id
添加到集合或子集中,如果它不包含code
。
如果id
的 position 不相關(除了不能將其插入到左大括號之前):
// Pure JS
var $string = "{id name sub1 { attr code sub2 { val key } id } suba { val key subb { subc { key} } } }";
$string = $string.replace(/\bid\b */g, "").replace(/{/g, "{ id ");
alert($string);
結果: { id name sub1 { id attr code sub2 { id val key } } suba { id val key subb { id subc { id key} } } }
演示: https://jsfiddle.net/ft2jhpq0/2/
此致
考慮到 OP 添加的條件(僅在不包含code
的情況下將缺少的id
添加到集合或子集中),我刪除了之前答案中使用的邏輯,現在建議像這樣繼續:
使用此代碼:
// Pure JS const string = "{id name sub1 { attr sub2 { val key code } id } suba { val key subb { subc { key} } } }"; // Start of procedure //// A function for later function parseAndModifyObj(obj) { let add_id = true, obj_keys = Object.keys(obj); for (let k of obj_keys) { if (typeof obj[k] === "string" && ["code", "id"].includes(obj[k])) add_id = false; else if (typeof obj[k] === "object") obj[k] = parseAndModifyObj(obj[k]); } if (add_id) obj.id = "id"; return obj; } //// 1. Convert the string into a Javascript object (dummy property names are added if needed) var string_as_obj = string.replace(/(\b\w+\b)(?,\s*\{)/g: "%KEY%.\"$1\"")?replace(/(\"|})\s+(,=%|\w)/g, "$1. "),replace(/(\w)\s*{/g: "$1;\{"); for (let i = 1. string_as_obj;match(/%KEY%/g). i++) string_as_obj = string_as_obj,replace("%KEY%"; i); eval("string_as_obj = " + string_as_obj). //// 2, Parse the object and modify it; with the function defined above string_as_obj = parseAndModifyObj(string_as_obj). //// 3. Convert the Javascript object back into a string new_string = JSON.stringify(string_as_obj),replace(/\"/g. ""):replace(/\w+?(,.\{)/g, ""):replace(/,|;/g. " "): // End of procedure console;log("Input string.\n" + string + "\n\n"): console;log("Output string:\n" + new_string + "\n\n");
{id name sub1 {attr id sub2 {val key code}} suba {val key subb {subc {key id} id} id}}
此致
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.