如何用JavaScript提取冒号间数字并转换为数组?
解决从字符串中提取
:数字:格式内容并转为数组的问题 嘿,我来帮你搞定这个提取图标ID的问题!咱们先分析下你之前的尝试为啥没达到预期,再给你靠谱的实现方式。
你之前尝试的问题分析
- 第一个用
substring的方法:只能定位最后一对冒号的位置,根本没法遍历所有匹配的:数字:,自然拿不到多个ID; - 第二个
match(":(.*):"):这里用了贪婪匹配的正则,会从第一个:开始一直匹配到最后一个:,把中间的文本也包含进去了,结果肯定不对; - 第三个
match(/:([^:]+):/):这个正则本身能匹配单个:数字:,但没加全局匹配标志g,所以只会返回第一个匹配结果,拿不到后面的:456:。
正确的实现方法
我们需要用带全局标志的正则匹配所有:数字:模式,然后提取其中的数字部分。这里有两种简单的实现方式:
方法1:使用match + map
const comment = 'This is my fav item :9044: and :456:'; // 先匹配所有`:数字:`格式的字符串,再截取掉前后的冒号 const iconIds = comment.match(/:\d+:/g)?.map(item => item.slice(1, -1)) || []; console.log(iconIds); // 输出: ["9044", "456"] // 如果需要转成数字类型,再加一步map(Number) const numericIconIds = iconIds.map(Number); console.log(numericIconIds); // 输出: [9044, 456]
方法2:使用matchAll(更精准)
matchAll会返回所有匹配结果的迭代器,我们可以直接提取捕获组里的数字:
const comment = 'This is my fav item :9044: and :456:'; // 正则里用括号捕获数字部分,加g全局匹配 const matches = comment.matchAll(/:(\d+):/g); // 把迭代器转成数组,提取每个匹配的第一个捕获组 const iconIds = Array.from(matches, match => match[1]); // 转数字类型 const numericIconIds = iconIds.map(Number); console.log(numericIconIds); // 输出: [9044, 456]
正则说明
:\d+::匹配以:开头和结尾,中间是一个或多个数字的字符串;g:全局匹配标志,确保找到所有符合条件的内容;(\d+):捕获组,专门提取中间的数字部分,方便在matchAll里直接获取。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

