Java Matcher.find()有时可以工作,但只能在星期二的午餐后使用

时间:2017-01-03 20:54:51

标签: java android regex

所以我正在为自定义Android IME创建自动完成/拼写检查器类。这工作得很好,我使用Matcher.find()来搜索“字典”对象。我目前正在使用Google提供的15k字的单词列表。

我把这个txt文件分成几部分(A-Z),通过使用正在检查的字符串的第一个字母加快搜索过程。 txt文件从资源加载到一个hashmap中,所有这些都很有用。

然后我使用正则表达式:

String patternString = "\\b(" + word + ")";

整个功能看起来像这样:

private void findAutoCompletes(String word) {
    setAlphaDictionary(Character.toUpperCase(word.charAt(0)));
    ArrayList<String> autoCompleteList = new ArrayList<>();

    String patternString = "\\b(" + word + ")";
    Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(alphaDictionary);

    while(matcher.find()) {
        String autoCompleteWord = pullStringFromDictionary(matcher.start());

        //if currentlyCheckAgainstList does not contain the word, add it to the autoCompleteList
        if (!autoCompleteWord.isEmpty()) {
            if (!currentlyCheckingAgainstList.contains(autoCompleteWord)) {
                currentlyCheckingAgainstList.add(autoCompleteWord);
            }
        }
    }
}

但是,使用此工具并不总是返回应有的内容:RegexPlant我运行了一些测试。使用\ b(we)作为正则表达式,并将[are,where,website,webcast,wendy]作为要测试的字符串。这些单词取自我的词典文本文件。我错过了什么吗?我仍然是Android开发的新手,我多年没有使用Java(3~4),我一直从事Web开发和iOS开发,直到这个项目。

如果有人能指出我正确的方向,我会非常感激。

编辑:我想补充说并非总是如此。这似乎是“参差不齐”。大多数时候,我得到的结果,我希望输入“生病”返回[非法,疾病,illnois]。

1 个答案:

答案 0 :(得分:3)

试试String patternString = "\\b(" + word + "\\w*)";。应该管用。刚刚在regex101.com上测试过。括号内的\w*将确保匹配整个单词,而不仅仅是搜索词。它将匹配以word开头并且后跟零个或多个字母字符的单词。