如何用正则匹配数字间含3个问号且数字和为10的字符串
解决方案
要实现判断字符串中是否存在**两个单个数字之和为10,且中间恰好包含3个问号(可夹杂其他非数字字符)**的情况,可以结合正则匹配和JavaScript逻辑处理,具体步骤如下:
步骤说明
- 匹配有效数字对:先提取字符串中所有「两个单个数字包裹、中间无其他数字」的子串,避免中间数字干扰判断。
- 校验数字和:对每个提取的子串,计算两个数字的和是否为10。
- 统计问号数量:校验符合和为10的子串中,问号数量是否恰好为3。
- 返回结果:只要存在任意一组符合条件的数字对,返回
true;否则返回false。
实现代码
function QuestionsMarks(str) { // 匹配所有两个单个数字(中间无其他数字)的子串 const numPairs = str.match(/\d[^\d]*?\d/g) || []; for (const pair of numPairs) { // 提取两个数字并转为数值类型 const [num1, num2] = pair.match(/\d/g).map(Number); // 校验数字和是否为10 if (num1 + num2 !== 10) continue; // 统计子串中问号的数量 const questionCount = (pair.match(/\?/g) || []).length; // 问号数量恰好为3则返回true if (questionCount === 3) { return true; } } // 无符合条件的数字对,返回false return false; } // 测试示例 console.log(QuestionsMarks("acc?7??sss?a3rr1??????5")); // 输出: true console.log(QuestionsMarks("aabc9??nnh?a1")); // 输出: true console.log(QuestionsMarks("a9??a1")); // 输出: false console.log(QuestionsMarks("a8??a3")); // 输出: false
代码解释
- 正则
/\d[^\d]*?\d/g:匹配两个单个数字,中间为任意非数字字符(非贪婪模式确保匹配最近的数字对)。 pair.match(/\d/g).map(Number):从每个数字对子串中提取两个数字并转为数值,方便计算和。(pair.match(/\?/g) || []).length:统计子串中的问号数量,若没有问号则返回空数组,长度为0。
内容的提问来源于stack exchange,提问作者dr3nan
相关产品推荐
相关产品推荐

