0

我有一个应用程序,语法学校的老师可以在问题后的页面上放置一个答案框。答案框由教师配置一个答案行,指定问题的可接受答案。我不希望他们给我一个有效的正则表达式作为答案,所以我让他们以简化的形式写出答案,其中“*”表示任何内容中的 0 个或更多,“,”分隔多个可接受的答案。所以一个包含

                          *cup,glass

将接受“茶杯”、“咖啡杯”、“杯子”或“玻璃杯”,但不接受“杯架”。

有没有一种方法可以将他们提供的答案线映射到一个正则表达式,我可以将学生的答案与之进行比较,从而给我一个正确或错误的答案,即这是一个可接受的问题答案,或者不是?

谢谢

4

3 回答 3

2

在我写这篇文章时,问题中没有指定语言 - 答案的确切形式将在很大程度上取决于它。让我们假设 JavaScript,因为大多数海报的标签似乎与 JavaScript 相关。

function toRegexp(e) {
    return new RegExp(
        "^(?:"+
            e.split(/,/).map(
                function(x){ 
                    return x.replace(/([.?+^$[\]\\(){}|-])/g, "\\$1").replace(/\*/g,".*");
                }
            ).join("|")+
        ")$", "i");
}

(感谢这个对特殊字符转义位的回答。)

于 2013-11-14T11:31:44.470 回答
1

我不确定您使用哪种语言执行此操作,但给出了输入字符串,例如*cup,glass

  • 添加^(到开头
  • 添加)$到最后
  • 全部替换*.*
  • 全部替换,|

给予^(.*cup|glass)$

在任何语言中,所有这些步骤都应该非常简单。

于 2013-11-14T11:27:29.697 回答
0

感谢您的输入。我得到的解决方案是http://jsfiddle.net/76zXf/12/。这似乎可以满足我的要求,并且在正确答案之前和之后允许任意数量的空格,并在答案中允许“+”和“-”。(因此,“3,+3,-3”的答案行适用于“9 的平方根是多少?”的问题)我能够使用比 proprelkey 发布的更简单的构建功能来做到这一点:

 $('#answerLine').change(function() {
     s = this.value.replace(/\*/,'.*'); // change all "*" for ".*"
     s = s.replace(/\+/,'\\+'); // change all "+" for "\+*"
     s = s.replace(/\-/,'\\-'); // change all "-" for "\-*"
     a1 = s.split(/,/); // get individual terms into an array
     a2 = a1.map(  // for each  term . . .
                  function(x){ 
                     exp = '^\\s*' + x + '\\s*$'; // build complete reg expression
                     return( exp );     // return this expression to array
                   }
                );
      re = RegExp( a2.join("|"),'i');    // our final, complete regExp

我希望我不会错过任何重要的案例。再次感谢。

于 2013-11-15T08:12:29.410 回答