1

我创建了一个简单的测验程序,并试图找出一种使用正则表达式返回 3 种类型答案的方法。3 个答案将是完全正确、正确(但拼写错误)和部分正确,但仍被授予正确。

因此,举个例子,与字符串“Elephants”相比,三个字符串是正确的:1.“Elephants”,2.“Elephants”,3.“Elephant”。

第一个字符串是完全正确的,所以会返回“正确答案”。

第二个字符串是正确的,但拼写错误('a' 而不是 'e'),因此将返回“Correct 尽管拼写为 Elephants”。

第三个字符串部分正确(最后没有's'),但会返回“Answer accepted”

谁能找出我可以用于这种方法的三种正则表达式?

非常感谢。

4

3 回答 3

0

对此没有正则表达式解决方案,但您可以实现“距离算法”来衡量两个单词的相对相似度。一种非常常见的算法是Levenshtein Distance或编辑距离:它告诉您从用户输入的答案到正确拼写的答案需要多少“编辑操作”。替换、插入或删除符号算作一项操作。如果距离为 2 或更小,则用户输入的答案很可能只是拼写错误;如果距离为 3 或更大,则要么是拼写非常糟糕的答案,要么是不正确的答案(两者都应被视为不正确)。

上面链接的维基百科文章具有该算法的伪代码实现。

于 2013-03-29T23:05:53.700 回答
0

第一个匹配的正则表达式:Elephants 如果不匹配,请尝试 Eleph[ae]nt 作为第二个。如果也没有,请尝试大象。

您还可以将其与词尾标记结合使用。

对于测试正则表达式,这个网站真的很酷: http: //gskinner.com/RegExr/

使用正则表达式,您必须尝试猜测拼写错误。

于 2013-03-29T23:07:15.850 回答
0
  1. 完全正确的正则表达式:

    “大象”

  2. 正确,尽管拼写为“大象”正则表达式:“[^E]lephants|E[^l]ephents|El[^e]phants|Ele[^p]hants|Elep[^h]ants|Eleph[^a]nts|大象[^n]ts|大象[^t]s|大象[^s]"

  3. 答案接受正则表达式:“lephants|Eephants|Elphants|Elehants|Elephants|Elephnts|Elephnts|Elephats|Elephans|Elephant”

您可以编写一个小程序,它会自动生成验证您的答案的正则表达式并输出您的正则表达式落入的情况

  • 正确的
  • 正确但拼写错误
  • 已接受答案

例如,假设正确答案是“大象”,您可以编写一个例程来测试第二种情况(尽管拼写错误,但正确)。

String generateCorrectAltoughMispelledAnswerRegex(final String answer) {
    StringBuilder builder = new StringBuilder();
    String answer = "Elephants";
    for (int i = 0; i < answer.length; i++) {
        String mispelled = answer.substring(0, i) + "[^" + char.at(i) + "]" + 
            (i < length ? answer.substring(i + 1) : "");
        answer.append(mispelled);
        if (i < length - 1) { answer.append("|"); }
    }
    String regex = builder.build();
    return regex;
}

例如:通过使用参数“Elephants”调用函数 generateCorrectAlthoughMispelledAnswerRegex generateCorrectAltoughMispelledAnswerRegex("Elephants")

它将生成用于测试第二种情况的正则表达式:

"[^E]lephants|E[^l]ephents|El[^e]phants|Ele[^p]hants|Elep[^h]ants|Eleph[^a]nts|Elepha[^n]ts|Elephan[^t]s|Elephant[^s]"

您可以对其他情况执行相同的操作。

于 2013-03-29T23:09:42.263 回答