javamatcher.find()有时可以工作,但只能在周二午餐后工作

fxnxkyjh  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(298)

因此,我正在为一个定制的android输入法创建一个自动完成/拼写检查类。这是非常好的工作,我正在使用matcher.find()搜索“dictionary”对象。我目前正在使用一个来自谷歌的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)作为regex表达式,使用[were,where,website,webcast,wendy]作为字符串进行测试。这些单词是从我的字典文本文件中提取的。我错过什么了吗?我对android开发还是一个新手,我已经有3~4年没有使用java了,在这个项目之前我一直在从事web开发和ios开发。
如果有人能给我指出正确的方向,我会非常感激的。
编辑:我想补充一点,事实并非总是如此。它似乎是“斑点”。大多数时候,我得到的结果都像输入“ill”返回值一样。

qlzsbp2j

qlzsbp2j1#

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

相关问题