2011-03-16 98 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)