Регулярное выражение для подтверждения ответа на вопрос - PullRequest
1 голос
/ 17 марта 2011

Привет всем, У меня небольшие затруднения при настройке регулярного выражения, которое оценивает предложение, введенное пользователем в текстовое поле, по ключевым словам. По сути, ключевые слова должны вводиться последовательно от одного к другому и могут иметь любое количество символов или пробелов до, между и после (т. Е. Если ключевыми словами являются «ворона» и «футы», то ворона должна быть где-то в приговор перед ногами. Так что с учетом этого, это утверждение должно быть действительным "бла-бла-sccui crow dsj футов"). Символы и в некоторой степени пробелы (я хотел бы, чтобы у ключевых слов был хотя бы один пробельный буфер в начале и в конце), являются полностью необязательными, основная проблема заключается в том, были ли ключевые слова введены в правильном порядке.

До сих пор мне удавалось работать с регулярным выражением в предложении, но не работало, если был введен только сам ответ.

У меня есть регулярное выражение, используемое в функции ниже:

// Comparing an answer with the right solution
protected boolean checkAnswer(String a, String s) {
    boolean result = false;
    //Used to determine if the solution is more than one word
    String temp[] = s.split(" ");

    //If only one word or letter
    if(temp.length == 1)
    {
        if (s.length() == 1) {
        // check multiple choice questions
            if (a.equalsIgnoreCase(s)) result = true;
            else result = false;
            }
            else {
                // check short answer questions
                if ((a.toLowerCase()).matches(".*?\\s*?" + s.toLowerCase() + "\\s*?.*?")) result = true;
                else result = false;
            }
    }
    else
    {
        int count = temp.length;
        //Regular expression used to
        String regex=".*?\\s*?";

        for(int i = 0; i<count;i++)
            regex+=temp[i].toLowerCase()+"\\s*?.*?";

        //regex+=".*?";
        System.out.println(regex);
        if ((a.toLowerCase()).matches(regex)) result = true;
        else result = false;
    }

    return result;

Любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 4 ]

3 голосов
/ 17 марта 2011

Я бы пошел по-другому.Вместо того, чтобы пытаться использовать одно регулярное выражение, почему бы не использовать что-то похожее на:

String answer = ... // get the user's answer

if( answer.indexOf("crow") < answer.indexOf("feet") )  {
    // "correct" answer
}

Вам все равно придется токенизировать слова в правильном ответе, а затем проверить в цикле, чтобы увидеть, если индекскаждое слово меньше индекса следующего слова.

0 голосов
/ 17 марта 2011

После ответа Билла я бы попробовал это:

String input = // get user input
String[] tokens = input.split(" ");
String key1 = "crow";
String key2 = "feet";   
String[] tokens = input.split(" ");
List<String> list = Arrays.asList(tokens);
return list.indexOf(key1) < list.indexOf(key2)
0 голосов
/ 17 марта 2011

В зависимости от сложности ответ Билла может быть самым быстрым решением.Если бы вы предпочли регулярное выражение, я бы не стал искать пробелы, а только границы слов.Таким образом, вам не придется обрабатывать запятые, точки и т. Д., А также:

String regex = "\\bcrow(?:\\b.*\\b)?feet\\b"

Это должно совпадать с «гусиными лапками», а также «гусиными лапками» и «вороньими лапками».*

Если вы хотите сопоставить несколько слов в определенном порядке, вы можете просто объединить их, используя '(?: \ B. * \ B)?'без дополнительной сортировки или проверки.

0 голосов
/ 17 марта 2011

Не думаю, что вам нужно разделить результат на "".

Если я правильно понимаю, вы должны быть в состоянии сделать что-то вроде

String regex="^.*crow.*\\s+.*feet.*"

Проблема с вышесказанным заключается в том, что он будет соответствовать "footcrow footcrow".

Может быть, что-то вроде

String regex="^.*\\s+crow.*\\s+feet\\s+.*"

Это приведет к тому, что слово будет там, а не в случайном блоке символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...