![](/img/trans.png)
[英]JavaScript: Cannot manipulate array produced with 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.