我正在開發一個用于 JSON 編輯的小型 UI,其中包括一些物件和字串操作。我能夠使它作業,但是其中一個領域有點棘手,我將不勝感激。初始字串:
'localhost=3000,password=12345,ssl=True,isAdmin=False'
應該轉換成這樣:
{ app_server: 'localhost:3000', app_password:'12345', app_ssl: 'True', app_isAdmin: 'False' }
我可以通過首先用回傳陣列的“,”分割字串來做到這一點。然后我會遍歷第二個陣列并用'='分割。在最后一步中,我將簡單地使用 forEach 回圈遍歷陣列并創建一個物件:
const obj = {}
arr2.forEach((item) => (obj[`app_${item[0]}`] = item[1]));
這種方法有效,但如果某些欄位,即密碼包含“,”或“=”,我的代碼將中斷。關于如何解決這個問題的任何想法?一些高級的正則運算式會是個好主意嗎?
編輯:為了簡單起見,似乎我造成了相反的效果,所以對此我深表歉意。
提到的字串是較大 JSON 檔案的一部分,它是值之一。在高層次上,我正在改變物件的形狀,每個具有我描述的結構的值'server='something,password=1234,ssl=True',都必須轉換為單獨的值,這些值將填充輸入欄位. 之后,用戶修改它們或簡單地下載檔案(我有單獨的邏輯將輸入欄位再次加入初始形狀)
uj5u.com熱心網友回復:
對您擁有的設計的觀察/限制:
- 根據您的評論,
none of the special characters is escaped in any way那么我們將如何閱讀此字串password=12345,ssl=True?會是app_password: 12345,ssl=True還是app_password: 12345? - 為什么
localhost=3000轉換成app_server: 'localhost:3000'而不是app_localhost: '3000'像其他鍵?對此有什么特殊要求嗎? - 您必須以至少不接受
,基本上用于拆分字串的字符的方式設計密碼欄位。
給你,如果我們能糾正上面提到的設計觀察:
const str = 'localhost=3000,password=123=45,ssl=True,isAdmin=False';
const splittedStr = str.split(',');
const result = {};
splittedStr.forEach(s => {
const [key, ...values] = s.split('=')
const value = values.join('=');
result[`app_${key}`] = value
});
console.log(result);
正如您在上面的代碼片段中看到的,我添加了密碼值,123=45并且它根據要求正常作業。
uj5u.com熱心網友回復:
您可以使用匹配key=value格式中的鍵和值的正則運算式,并在值恰好以單引號開頭時捕獲單引號之間的任何內容:
(\w )=(?:'((?:\\.|[^'])*)'|([^,] ))
這假設:
- 密鑰僅由字母數字字符和下劃線組成
- 周圍沒有空格
=(后面的任何空格都被認為是值的一部分) - 如果該值以單引號開頭,則將其視為整個值的分隔符,該分隔符將由另一個引號終止,該引號后面必須跟一個逗號,或者必須是字串中的最后一個字符。
- 如果該值沒有被參考,則直到下一個逗號或字串結尾的所有字符都將成為該值的一部分。
正如您所解釋的,第一部分不遵循 key=value 模式,而只是一個值,我們需要處理這個例外。我建議在字串前面加上前綴server=,這樣現在第一部分也有 key=value 模式。
此外,由于此輸入是 JSON 中出現的值的一部分,因此應將其決議為 JSON 字串(雙引號),以便解碼其中可能出現的任何轉義字符,例如\n(反斜杠后跟“n ”)。
由于沒有澄清引號出現在帶引號的字串中時如何轉義,因此仍不確定例如密碼(或任何文本欄位)如何包含引號。上面的正則運算式將要求,如果引號后面有一個不是逗號的字符,則引號將被視為值的一部分,而不是終止字串。但這只是在轉移問題,因為現在不可能',在參考欄位中編碼序列。如果這一點得到澄清,則可以相應地調整正則運算式。
JavaScript 中的實作:
const regex = /(\w )=(?:'(.*?)'(?![^,])|([^,] ))/g;
function parse(s) {
return Object.fromEntries(Array.from(JSON.parse('"server=' s '"').matchAll(regex),
([_, key, quoted, value]) => ["app_" key, quoted ?? (isNaN(value) ? value : value)]
));
}
// demo:
// Password includes here a single quote and a JSON encoded newline character
const s = "localhost:3000, password='12'\\n345', ssl='True', isAdmin='False'";
console.log(parse(s));
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/491509.html
標籤:javascript 细绳 目的
