Coderbyte挑战:问号-RegExp模式'/ d(\?\?\?)d / gi'不正确

时间:2018-08-05 18:04:45

标签: javascript regex design-patterns interpreter

我正在解决Coderbyte Challenge - Questions Marks 当我在浏览器中运行代码时,一切正常,但是,一旦在coderbyte网站上运行它,则会引发错误。

挑战是:

  

让功能QuestionsMarks(str)接受str字符串参数,   其中将包含一个数字,字母和问号,   并检查每对之间是否有3个问号   两个数字加起来等于10。如果是,则您的程序应返回   字符串true,否则应返回字符串false。如果有   不是任何两个数字加起来等于10的字符串,那么您的   程序也应返回false。

     

例如:如果str为“ arrb6 ??? 4xxbl5 ??? eee5”,则您的程序   应该返回true,因为之间有3个问号   6和4,在末尾5和5之间有3个问号   串。

     

使用下面框中的参数测试功能来测试您的代码   有不同的论点。

测试用例为:

  

“ arrb6 ??? 4xxbl5 ??? eee5”

     

“ aa6?9”

     

“ acc?7 ?? sss?3rr1 ?????? 5”

对此,我的解决方案是使用RegExp解决挑战。在浏览器中运行以下代码时,效果很好,但是Coderbyte控制台每次都会引发错误:

  

/tmp/009904362/main.js:11 clean = clean.match(/ d(???)d / gi); ^ SyntaxError:无效的正则表达式:/ d(???)d /

这是我的代码-

function QuestionsMarks(str) { 

//create a "clean" array containing only the numbers and question marks from str
  var result;
  let clean = str.match(/[0-9?]/g);
// join() the array back in to the string
  clean = clean.join("");     

// use match() to return an array of pairs that match the pattern d???d  
 clean = clean.match(/d(\?\?\?)d/gi);

//create a function sumCheck() that converts first and last char of every array string to Number and checks if the sum of digits is 10
//using forEach() run the sumcheck() on all strings in the array
 clean.forEach(sumCheck);

 function sumCheck(string){
        if((Number(string.charAt(0)) + Number(string.charAt(string.length - 1)))  == 10){
                result = true;
        }else{
            result = false;
        }
 }
    return result;
  }
QuestionsMarks("acc?7??sss?3rr1??????5");

1 个答案:

答案 0 :(得分:2)

问题似乎来自Coderbyte,它无法解析正则表达式模式(文字或RegExp构造函数)中正确转义的字符。因此,最简单的解决方案是替换转义的序列:\d => [0-9]\? => [?](@ Saud在评论中建议)。


关于您的方法:

  

...检查对的两个数字之间是否恰好有3个问号,它们加起来等于10 ...

更正后的模式/[0-9][?]{3}[0-9]/g是什么?
它查找由三个问号分隔的数字(然后检查两个数字的总和是否为10)。即使此模式能够找到字符串中由三个问号分隔的所有数字对(不是这种情况,(*)),它也不会检查是否有数字加起来最多10个,而且不能完全由3个问号隔开!

因此,目标是查找字符串是否包含一对数字,这些数字加起来最多为10,没有 3个问号。如果存在该对,则函数返回false


(*):为什么/[0-9][?]{3}[0-9]/g找不到由3个问号分隔的所有数字对?

示例:1???2???3???4
因为您不能两次匹配同一字符。该模式将找到:1???23???4,但找不到2???3,因为2已被第一次匹配所消耗。


一种可行的方法:

function QuestionsMarks(str) {
    var state = { d1: 0, d2: 0, marks: 0,
        init: function() { this.d1 = this.d2; this.marks = 0; },
        check: function() { return this.d1 + this.d2 > 9 && this.marks != 3; }
    };  
    var re = /[0-9?]/g;
    var m;

    while ( (m = re.exec(str)) !== null ) {
        if ( m[0] == '?' ) {
            state.marks++;
        } else {
            state.d2 = parseInt(m[0]);
            if ( state.check() ) return false;
            state.init();  
        }
    }
    return true;
}