Java Scanner找不到单词

时间:2016-01-07 12:54:10

标签: java pattern-matching java.util.scanner

我很抱歉,如果有一些非常简单的事情我会失踪。

我有以下代码:

import java.util.Scanner;
import java.io.File;
import java.util.regex.Pattern;
public class UnJumble
{
    String[] ws;
    int ind=0;
    public static void main(String args[]) throws Exception
    {
        System.out.println("Enter a jumbled word");
        String w = new Scanner(System.in).next();

        UnJumble uj = new UnJumble();
        uj.ws = new String[uj.fact(w.length())];
        uj.makeWords("",w);

        int c=1;
        Scanner sc = new Scanner(new File("dict.txt"));
        for(int i=0; i<uj.ws.length; i++)
        {
              Pattern pat = Pattern.compile(uj.ws[i].toUpperCase());
              if(sc.hasNext(pat))
                    System.out.println(c+++" : \'"+uj.ws[i]+"\'");
        }

        System.out.println("Search Completed.");
        if(c==1) System.out.println("No word found.");
    }

    public void makeWords(String p,String s)
    {
        if(s.length()==0)
              ws[ind++] = p;
        else
              for(int i=0; i<s.length(); i++)
                    makeWords(p+s.charAt(i),s.substring(0,i)+s.substring(i+1));
    }

    public int fact(int n)
    {
        if(n==0) return 1;
        else return n*fact(n-1);
    }
}

dict.txt文件是SOWPODS字典,是官方的Scrabble字典..

我想接受一个混乱的单词,并重新排列它以检查它是否存在于字典中。如果是,则打印出来。

当我尝试tra作为输入时,输出显示No word Found.。 但输出应包含tarartrat

请告诉我我在哪里弄错了。如果我犯了一个非常简单的错误,我很抱歉,因为这是我第一次使用Pattern

1 个答案:

答案 0 :(得分:1)

这是来自Scanner.hasNext(Pattern pattern)的JavaDoc(我突出显示)

  

如果下一个完整标记与指定模式匹配,则返回true。

当您的扫描程序使用文件dict.txt进行初始化时,它位于位于第一个单词

dict.txt中的第一个完整令牌与您的任何抄袭词都不匹配,因此找不到匹配项。

注意:这假设每行有一个单词

我认为你可能想要更改你的代码,以便在字典文件中找到你的加密文本某处(在行之前和之后的行尾)导致模式"(^|\\W)"+uj.ws[i].toUpperCase()+"(\\W|$)"

之类的东西
 String dictstring = your dictionary as one string;

 Matcher m = p.matcher(dictstring);
 if(m.find()) {
  ...

我建议您IOUtils.toString()阅读您的文件:

String dictstring = "";
try(InputStream is = new FileInputStream("dict.txt")) {
  dictstring = IOUtils.toString(is);
}

这是一个熟悉模式和匹配器的小例子代码:

    String dictString= "ONE\r\nTWO\r\nTHREE";
    Pattern p = Pattern.compile("(^|\\W)TWO(\\W|$)");
    Matcher m = p.matcher(dictString);
    if(m.find()) {
        System.out.println("MATCH: " + m.group());
    }