如何用单条RegEx在JavaScript中捕获任意起始的键盘连续字符序列
解决方案
你要匹配的主键盘区中间行连续走键序列严格遵循asdfghjkl的相邻顺序,只要把所有可能的≥3长度的起始子段整合到单条正则的多选分支里,就能实现任意位置起始的序列捕获,不需要单独写多套规则。
可用单条正则
/(asd(?:f(?:g(?:h(?:j(?:k(?:l)?)?)?)?)?|sdf(?:g(?:h(?:j(?:k(?:l)?)?)?)?)?|dfg(?:h(?:j(?:k(?:l)?)?)?)?|fgh(?:j(?:k(?:l)?)?)?|ghj(?:k(?:l)?)?|hjkl?|jkl)/gi
基础使用示例(非重叠匹配)
默认匹配最长非重叠的连续序列,直接拿匹配结果的length属性即可得到序列长度:
const inputStr = "testasdfgh123sdfgxxjkl"; const keySeqRegex = /(asd(?:f(?:g(?:h(?:j(?:k(?:l)?)?)?)?)?|sdf(?:g(?:h(?:j(?:k(?:l)?)?)?)?)?|dfg(?:h(?:j(?:k(?:l)?)?)?)?|fgh(?:j(?:k(?:l)?)?)?|ghj(?:k(?:l)?)?|hjkl?|jkl)/gi; const matches = inputStr.match(keySeqRegex) || []; const seqLengths = matches.map(item => item.length); console.log(matches); // 输出:['asdfgh', 'sdfg', 'jkl'] console.log(seqLengths); // 输出:[6, 4, 3]
重叠匹配场景
如果你需要捕获所有重叠的符合要求子段(比如asdf要同时拿到asd、asdf、sdf),可以改用带正向前瞻捕获的正则:
const input = "asdf"; const overlapRegex = /(?=(asd(?:f(?:g(?:h(?:j(?:k(?:l)?)?)?)?)?|sdf(?:g(?:h(?:j(?:k(?:l)?)?)?)?)?|dfg(?:h(?:j(?:k(?:l)?)?)?)?|fgh(?:j(?:k(?:l)?)?)?|ghj(?:k(?:l)?)?|hjkl?|jkl))/gi; const matches = []; let match; while((match = overlapRegex.exec(input)) !== null) { matches.push(match[1]); } console.log(matches); // 输出:['asd', 'asdf', 'sdf']
如果需要适配其他键盘行(比如顶行qwertyuiop、底行zxcvbnm),按照相同逻辑把对应起始的≥3长度连续子段加入正则的多选分支即可。
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

