我有兩種從 API 回傳的字串。它們如下所示:
let string1 = "\n1. foo\n2. bar\n3. foobar"
let string2 = "\n\n1. foo.\n\n2. bar.\n\n3. foobar."
需要明確的是,字串 1將始終有 3 個專案回傳,字串 2有未知數量的專案回傳。但非常相似的模式。
我想要做的是僅從每個專案中提取文本到一個陣列中。
所以從string1我想要["foo", "bar", "foobar"]
從string2我想要["foo.", "bar.", "foobar."]
我在正則運算式方面很糟糕,但不知何故我偶然發現了一個運算式,它可以為兩種字串型別完成此操作,但是,它使用正則運算式的lookbehind,我試圖避免這種情況,因為并非所有瀏覽器都支持它:
let regex = /(?<=\. )(.*[a-zA-Z])/g;
let resultArray = str.match(regex);
有人可以幫助我將此正則運算式重構為不使用后視的東西嗎?
uj5u.com熱心網友回復:
編輯:請參閱@Oleg-Barabanov 的解決方案,它在技術上要快一些。
string.replace(/\n[0-9.]*/g, "").split(" ").slice(1)
\n對于新線0-9對于數字(也可以使用\d.對于數字后面的點g替換所有.split(" ")把它切碎,只要有空格(\s)
演示:
let string1 = "\n1. foo\n2. bar\n3. foobar"
let string2 = "\n\n1. foo.\n\n2. bar.\n\n3. foobar."
const parse = (str) => str.replace(/\n[0-9.]*/g, "").split(" ").slice(1)
console.log(parse(string1))
console.log(parse(string2))
uj5u.com熱心網友回復:
(?<=\. )(.*[a-zA-Z])關于您嘗試的模式的一些說明:
第一部分在左側宣告一個點和空格,但不考慮任何換行符,因此它也可能匹配其他位置
它不考慮匹配串列項的數字
模式的第二部分匹配,直到最后一次出現與示例中的結束點不匹配的字符 A-Za-z
string2
您的所有示例字串都以換行符、數字、點和 1 個或多個空格開頭。
您可以在不使用lookbehind 的情況下獲取匹配項,并通過使用串列項格式啟動匹配項來使模式更加具體。
然后在捕獲組中捕獲該行之后的其余部分。
\n\d \.[^\S\r\n] (. )
解釋
\n匹配換行符\d \.匹配 1 個數字和一個點[^\S\r\n]匹配 1 個或多個不帶換行符的空格(. )捕獲組 1,匹配 1 個或多個字符
查看正則運算式演示。
const regex = /\n\d \.[^\S\r\n] (. )/g;
[
"\n1. foo\n2. bar\n3. foobar",
"\n\n1. foo.\n\n2. bar.\n\n3. foobar."
].forEach(s => {
console.log(Array.from(s.matchAll(regex), m => m[1]))
});
如果字串也應該在沒有前導換行符的情況下匹配,您可以使用錨^來斷言字串的開頭并使用多行標志/m
const regex = /^\d \.[^\S\r\n] (. )/gm;
[
"1. foo\n2. bar\n3. foobar",
"1. foo.\n\n2. bar.\n\n3. foobar."
].forEach(s => {
console.log(Array.from(s.matchAll(regex), m => m[1]))
});
uj5u.com熱心網友回復:
使用 a 的 OP 代碼String.match實際上比建議的解決方案更好。它只需要稍作調整即可使其正常作業,這就是問題所在:
string1.match(/([A-z]. )/g)
// TEST
[
"\n1. foo\n2. bar\n3. foobar",
"\n\n1. foo.\n\n2. bar.\n\n3. foobar."
].forEach(p => {
console.log( p.match(/([A-z]. )/g) )
});
uj5u.com熱心網友回復:
如果我理解正確,那么也許這個解決方案可以幫助你:
const string1 = "\n1. foo\n2. bar\n3. foobar";
const string2 = "\n\n1. foo.\n\n2. bar.\n\n3. foobar.";
const parse = (str) => {
return str.split(/\n[0-9.\s]*/g).filter((item) => item !== "");
}
console.log('Example 1:', parse(string1));
console.log('Example 2:', parse(string2));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/479775.html
標籤:javascript 正则表达式
