JavaScript环境下符合指定字符串提取规则的正则表达式编写求助
JavaScript 正则字符串提取实现方案
需求说明
待处理原始字符串示例
B9966 ch6258 028 chIRZ170 IRZ170 B8966A BA966C
期望输出
966 6258 028 170 170 966A BA966C
提取规则
- 若字符串以1个非数字字符开头,该字符后的第一个数字不计入输出(例如
B9966输出966) - 若字符串为纯整数,完整输出整串
- 字符串
B8966A的输出需为966A - 不满足以上三个条件时,输出字符串中的所有数字部分
实现方案
由于JavaScript不支持条件正则语法,可采用后行断言+分支匹配的方式实现更简洁严谨的正则,兼容ES2018及以上运行环境:
优化后正则
^\d+$|(?<=^\D\d)\S+|(?<=^\D{2,})\S*(\d[\dA-Za-z]*)
代码示例
const extractRegex = /^\d+$|(?<=^\D\d)\S+|(?<=^\D{2,})\S*(\d[\dA-Za-z]*)/; const rawStrList = [ 'B9966', 'ch6258', '028', 'chIRZ170', 'IRZ170', 'B8966A', 'BA966C' ]; const outputList = rawStrList.map(str => { const matchRes = str.match(extractRegex); // 优先取分组捕获的内容,无分组则取全匹配结果 return matchRes[1] ?? matchRes[0]; }); console.log(outputList); // 输出:['966', '6258', '028', '170', '170', '966A', 'BA966C']
规则匹配逻辑说明
- 第一个分支
^\d+$匹配纯整数字符串,直接全量输出 - 第二个分支
(?<=^\D\d)\S+匹配单个非数字开头的字符串,跳过开头的1个非数字和紧随的1个数字,输出剩余内容,对应规则1和规则3的要求 - 第三个分支
(?<=^\D{2,})\S*(\d[\dA-Za-z]*)匹配2个及以上非数字开头的字符串,跳过所有前缀非数字字符,提取首个数字开始到末尾的内容,符合规则4要求
内容的提问来源于stack exchange,提问作者Mohsen Movahed
相关产品推荐
相关产品推荐

