1

簡単なクイズ プログラムを作成し、正規表現を使用して 3 種類の回答を返す方法を見つけようとしています。3 つの答えは、完全に正しい、正しい (スペル ミスあり)、部分的に正しいのいずれかですが、それでも正しいと評価されます。

したがって、例として、文字列「Elephants」と比較すると、メソッドから 3 つの文字列が正しくなります: 1.「Elephants」、2.「Elephants」、3.「Elephant」。

1 番目の文字列は完全に正しいため、"正解" が返されます。

2 番目の文字列は正しいですが、スペル ミス ('e' ではなく 'a') であるため、"Correct but spelled Elephants" が返されます。

3 番目の文字列は部分的に正しい (最後に 's' がない) が、「回答は受け入れられました」を返します。

この方法で使用できる 3 種類の Regex 式を特定できる人はいますか?

ありがとうございました。

4

3 に答える 3

0

これに対する正規表現の解決策はありませんが、「距離アルゴリズム」を実装して、2 つの単語の相対的な類似度を測定できます。このための非常に一般的なアルゴリズムの 1 つは、 Levenshtein Distanceまたは Edit Distance です。これは、ユーザーが入力した回答から正しいスペルの回答に至るまでに必要な「編集操作」の回数を示します。シンボルの置換、挿入、または削除は、1 つのアクションとしてカウントされます。距離が 2 以下の場合、ユーザーが入力した回答は単なるスペル ミスである可能性があります。距離が 3 以上の場合は、スペルが非常に不適切な回答か、不正解です (どちらも不正解としてカウントされます)。

上にリンクされたウィキペディアの記事には、アルゴリズムの疑似コード実装があります。

于 2013-03-29T23:05:53.700 に答える
0

一致する最初の正規表現: Elephants 一致しない場合は、2 番目に Eleph[ae]nt を試してください。そうでない場合は、Elephant を試してください。

さらに、ワードエンドマーカーと組み合わせることができます。

正規表現をテストするには、このサイトが非常に便利です: http://gskinner.com/RegExr/

正規表現では、スペルミスを推測する必要があります..

于 2013-03-29T23:07:15.850 に答える
0
  1. 完全に正しい正規表現:

    「ゾウ」

  2. 「Elephants」と綴られていますが正しい 正規表現: "[^E]lephants|E[^l]ephents|El[^e]phants|Ele[^p]hants|Elep[^h]ants|Eleph[^a]nts|エレファ[^n]ts|エレファン[^t]s|エレファント[^s]"

  3. 回答は受け入れられました

答えを検証し、正規表現が当てはまるケースを出力する正規表現を自動的に生成する小さなプログラムを書くことができます

  • 正しい
  • スペルミスがあっても正しい
  • 回答可

たとえば、正解が「Elephants」であると仮定すると、2 番目のケースをテストするルーチンを作成できます (つづりが間違っていても正解)。

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;
}

例: 関数 generateCorrectAlthoughMispelledAnswerRegex を引数 "Elephants" で呼び出すことによって generateCorrectAltoughMispelledAnswerRegex("Elephants")

2 番目のケースのテストに正規表現を生成します。

"[^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 に答える