簡體   English   中英

在字符串的每一層大括號上插入字符串

[英]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添加到集合或子集中),我刪除了之前答案中使用的邏輯,現在建議像這樣繼續:

  1. 將字符串轉換為 Javascript object。
  2. 解析 object 並修改它。
  3. 將 object 轉換回字符串。

使用此代碼:

 // 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM