簡體   English   中英

Javascript string.match拒絕返回多個匹配的數組

[英]Javascript string.match refuses to return an array of more than one match

我有一個字符串,我期望格式如下:

{List:[Names:a,b,c][Ages:1,2,3]}

我的查詢在javascript中看起來像這樣:

var str = "{List:[Names:a,b,c][Ages:1,2,3]}";
var result = str.match(/^\{List:\[Names:([a-zA-z,]*)\]\[Ages:([0-9,]*)\]\}$/g);

注意:我認識到使用這個正則表達式會傳遞類似“Ages:,,,”的東西,但我現在並不擔心這一點。

我期待得到這個:

result[0] = "{List:[Names:a,b,c][Ages:1,2,3]}"
result[1] = "a,b,c"
result[2] = "1,2,3"

但無論我對正則表達式做什么,它都拒絕返回多個匹配的數組,我只是返回完整的字符串(因為它通過,這是一個開始):

result = ["{List:[Names:a,b,c][Ages:1,2,3]}"]

我已經在這里查看過一堆問題,以及其他“介紹”文章,但它們似乎都沒有解決這個基本問題。 我確定我忽略了一些愚蠢的東西,但我真的不知道它是什么:(

因此,這與JavaScript中的正則表達式中應用全局標志的方式不同。

.match ,全局標志(結尾處的/g )將返回正則表達式與字符串匹配的每個事件的數組。 如果沒有該標志, .match將返回字符串中所有分組的數組。

例如:

var str = "{List:[Names:a,b,c][Ages:1,2,3]}";
str += str;
// removed ^ and $ for demonstration purposes
var results = str.match(/\{List:\[Names:([a-zA-z,]*)\]\[Ages:([0-9,]*)\]\}/g)
console.log(results)
// ["{List:[Names:a,b,c][Ages:1,2,3]}", "{List:[Names:a,b,c][Ages:1,2,3]}"]
str = "{List:[Names:a,b,c][Ages:1,2,3]}{List:[Names:a,b,c][Ages:3,4,5]}";
results = str.match(/\{List:\[Names:([a-zA-z,]*)\]\[Ages:([0-9,]*)\]\}/g);
console.log(results)
//["{List:[Names:a,b,c][Ages:1,2,3]}", "{List:[Names:a,b,c][Ages:3,4,5]}"]

現在,如果我們刪除那個/g標志:

// leaving str as above
results = str.match(/\{List:\[Names:([a-zA-z,]*)\]\[Ages:([0-9,]*)\]\}/);
console.log(results)
//["{List:[Names:a,b,c][Ages:1,2,3]}", "a,b,c", "1,2,3"]

並且作為regex.exec工作regex.exec的說明, 這是因為:

如果正則表達式不包含g標志,則返回與regexp.exec(字符串)相同的結果。

您在搜索表格needle.exec(haystack)

從我的控制台:

> haystack = "{List:[Names:a,b,c][Ages:1,2,3]}";
"{List:[Names:a,b,c][Ages:1,2,3]}"

> needle = /^\{List:\[Names:([a-zA-z,]*)\]\[Ages:([0-9,]*)\]\}$/g ;
/^\{List:\[Names:([a-zA-z,]*)\]\[Ages:([0-9,]*)\]\}$/g

> needle.exec(haystack);
["{List:[Names:a,b,c][Ages:1,2,3]}", "a,b,c", "1,2,3"]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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