Java Matcher.find()有时有效,但只有在周二午餐后才有效



所以我正在为自定义Android输入法创建一个自动完成/拼写检查器类。这非常有效,我使用Matcher.find()来搜索"dictionary"对象。我目前正在使用一个来自谷歌的15000个单词的单词列表。

我把这个txt文件分成几个部分(A-Z),通过使用要检查的字符串的第一个字母来加快搜索过程。txt文件从资产加载到哈希图中,所有这些都非常有效。

然后我使用正则表达式:

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]作为字符串进行测试。这些单词取自我的字典文本文件。我是不是错过了什么?我对安卓系统的开发还是有点陌生,我已经有3到4年没有使用Java了,在这个项目之前,我一直在从事网络开发和iOS开发。

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

编辑:我想补充一点,事实并非总是如此。它看起来有点"斑点"。大多数时候,我得到的结果都是我所期望的,比如输入"ill"返回[非法、生病、生病]。

尝试String patternString = "\b(" + word + "\w*)";。应该有效。刚刚在regex101.com上进行了测试。括号中的w*将确保匹配整个单词,而不仅仅是搜索词。它将匹配以word开头且后面有零个或多个字母字符的单词。

最新更新