正则匹配对象键中的pop/pops单词(解决下划线场景失效问题)
解决JavaScript对象键匹配含pop/pops的问题
嘿,我知道你卡在正则匹配的问题上了!你之前用的/\b(pop|pops)\b/之所以匹配不到time_pop、home_pops这类键,核心原因是正则里的\b单词边界不识别下划线作为分隔符——因为下划线_属于正则的「单词字符」(和字母、数字归为一类),所以time_pop里的_和p都是单词字符,\b不会认为这是一个边界,自然就匹配不到后面的pop了。
修正后的正则方案
我们需要调整正则,让它能识别下划线分隔的pop/pops,同时也能匹配单独的pop/pops键。这里推荐使用正向/反向预查来界定匹配范围:
const expr = /(?<=^|_)pop(?:s)?(?=_|$)/;
正则拆解
让我解释下这个正则各部分的作用:
(?<=^|_):反向预查,确保pop/pops的前面要么是字符串开头(^),要么是下划线(_)pop(?:s)?:匹配pop或者pops,(?:s)?是一个非捕获组,表示s是可选的(不需要捕获这个s单独处理)(?=_|$):正向预查,确保pop/pops的后面要么是下划线(_),要么是字符串结尾($)
完整使用示例
把这个正则用到你的代码里,就能得到想要的筛选结果了:
const obj = { time_pop: 'fhfvla', icon: 'dsfval', home_pops: 'valffg', title: 'sdfsdfs', pop: 'sfsdfsd', rattle: 'sdfdsf', pops: 'sfsdfsdf' }; const expr = /(?<=^|_)pop(?:s)?(?=_|$)/; const filteredEntries = Object.entries(obj).filter(([key]) => expr.test(key)); console.log(filteredEntries); // 输出结果: // [ // ["time_pop", "fhfvla"], // ["home_pops", "valffg"], // ["pop", "sfsdfsd"], // ["pops", "sfsdfsdf"] // ]
补充说明
如果你的键里还有其他分隔符(比如短横线-),只需要把正则里的_换成[-_]就可以了,比如:
const expr = /(?<=^|[-_])pop(?:s)?(?=[-_]|$)/;
这样就能兼容下划线和短横线分隔的场景啦!
内容的提问来源于stack exchange,提问作者me-me
相关产品推荐
相关产品推荐

