2011-03-16 39 views
1

嘿大家, 我在設置正則表達式時遇到了一些小難題,該正則表達式將用戶在文本框中輸入的句子評估爲關鍵字。實質上,關鍵字必須從一個連續輸入到另一個,並且可以在之前,之間和之後具有任意數量的字符或空格(即,如果關鍵字是「烏鴉」和「英尺」,則烏鴉必須位於因此考慮到這一點,這個陳述應該是有效的「)。在一定程度上,字符和空間(我希望關鍵字在開始和結尾至少有一個空格緩衝區)是完全可選的,主要關心的是關鍵字是否按照正確的順序輸入。用於驗證問題答案的正則表達式

到目前爲止,我能夠在一個句子中使用正則表達式工作,但如果僅輸入答案本身,則無法工作。

我在下面的函數中使用正則表達式:

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

任何幫助將大大讚賞。 謝謝。

+0

關鍵詞「魚尾紋」僅僅是一個例子,它可以是任何數量的不同的詞。 – Steve 2011-03-16 23:37:28

回答

3

我會以不同的方式去解決這個問題。而不是試圖用一個正則表達式,爲什麼不使用類似的東西:

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

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

您仍然需要來標記對正確答案的話,那麼在一個循環檢查,看看是否每個字的索引小於下列單詞的索引。

0

我不認爲你需要將結果拆分爲「」。

如果我理解正確的話,你應該能夠與上面做一些像

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

的問題是,它將匹配「feetcrow feetcrow」。

也許像

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

這將強制執行,這個詞是有而不是隻在一個隨機生成的塊。

0

根據複雜性,比爾的答案可能是最快的解決方案。如果你更喜歡正則表達式,我不會尋找任何空格,而是尋找詞邊界。這樣,你就不必處理逗號,點等,以及:

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

這應該與「烏鴉BLA腳」以及「crowfeet」和「烏鴉腳」。

必須按特定順序匹配多個單詞,您可以使用'(?:\ b。* \ b)將它們連接在一起?'而不需要任何額外的分類或檢查。

+0

它應該,但沒有,因爲它解決了一個更容易的問題(例如bla crow foot不允許)。使用正則表達式來檢查語義信息本身就是有缺陷的,並且是一個非常糟糕的主意。即使是像這樣的最簡單更復雜的例子,也可能會非常複雜。 – Voo 2011-03-16 23:32:05

0

繼比爾的答案,我想試試這個:

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)