我正在嘗試從字串形式的物件中挑選出所有值。我已經創建了正則運算式,但我仍然遇到無法洗掉引號并且碰壁的問題......
這是我得到的結果與所需結果相比的代碼:
const regex = /(?:"([^"] )\")|([^=",{}.] )/g
const string = 'obj{a="0",b="1",domain="a-ss.test.io:666",f="g",range="3.594e-04...4.084e-04"}'
const matches = string.match(regex)
console.log(matches)
這是結果陣列:
[
"obj",
"a",
"\"0\"",
"b",
"\"1\"",
"domain",
"\"a-ss.test.io:666\"",
"f",
"\"g\"",
"range",
"\"3.594e-04...4.084e-04\""
]
雖然我想要的結果是:
[
"obj",
"a",
"0",
"b",
"1",
"domain",
"a-ss.test.io:666",
"f",
"g",
"range",
"3.594e-04...4.084e-04"
]
有誰知道如何從回傳的每個陣列值中洗掉引號?
uj5u.com熱心網友回復:
您需要在結果中獲取完整的匹配值,因為String#match使用包含/g標志的正則運算式會丟失所有捕獲。看到String#match回傳:
其
Array內容取決于全域 (g) 標志的存在與否,或者null是否找到匹配項。
- 如果
g使用該標志,則將回傳與完整正則運算式匹配的所有結果,但不包括捕獲組。- 如果
g未使用該標志,則僅回傳第一個完整匹配及其相關的捕獲組。在這種情況下,將回傳與(具有一些額外屬性的陣列)match()相同的結果。RegExp.prototype.exec()
您想要獲取第 1 組或第 2 組的值,因此要求引擎只回傳它們:
const regex = /"([^"] )"|([^=",{}.] )/g
const string = 'obj{a="0",b="1",domain="a-ss.test.io:666",f="g",range="3.594e-04...4.084e-04"}'
const matches = Array.from(string.matchAll(regex), x => x[1] || x[2])
console.log(matches)
uj5u.com熱心網友回復:
下一個提供的方法使用正則運算式 ... /(?<key>\p{L} )="(?<value>[^"]*)"|(?<id>\p{L} )\{/gu... 它使用命名捕獲組和unicode 轉義(后者用于匹配任何語言中的任何字母序列 ... \p{L} )。
正則運算式首先嘗試通過其第一個替代模式匹配和捕獲表單對... key...value匹配...<key>="<value>"(?<key>\p{L} )="(?<value>[^"]*)"
- 并捕獲任何語言的任何字母序列......
(?<key>\p{L} ) - 后面跟著兩個字符...
=" - 后跟捕獲的不包含雙引號的字符序列...
(?<value>[^"]*) - 后跟雙引號 ...
"。
<obj>{ ... }否則,它會嘗試通過其第二個替代模式來匹配和捕獲表單中與物件相關的部分... (?<id>\p{L} )\{...匹配...
- 并捕獲任何語言的任何字母序列......
(?<id>\p{L} ) - 后面是一個左大括號
\{......
然后,該模式被matchAll需要將回傳值轉換為陣列以便可映射的位置消耗。
使用的方法是flatMap因為回呼要么回傳捕獲的單個id值,要么回傳其他兩個捕獲值的陣列key和value.
const sampleData = `obj{a="0",b="1",domain="a-ss.test.io:666",f="g",range="3.594e-04...4.084e-04"}`;
// see ... [https://regex101.com/r/PjNhlx/1]
const regXTokens = /(?<key>\p{L} )="(?<value>[^"]*)"|(?<id>\p{L} )\{/gu;
console.log(
[...sampleData.matchAll(regXTokens)]
.flatMap(({ groups: { id, key, value } }) => id || [key, value])
);
uj5u.com熱心網友回復:
假設您的參考值中沒有字符{, }, =, ",,您可以簡單地.split()在這些字符上使用 a :
const string = 'obj{a="0",b="1",domain="a-ss.test.io:666",f="g",range="3.594e-04...4.084e-04"}';
let matches = string.split(/[\{\}\=",] /);
console.log(matches);
輸出:
[
"obj",
"a",
"0",
"b",
"1",
"domain",
"a-ss.test.io:666",
"f",
"g",
"range",
"3.594e-04...4.084e-04",
""
]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/519975.html
