因此,我正在为一个定制的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”返回值一样。
1条答案
按热度按时间qlzsbp2j1#
尝试
String patternString = "\\b(" + word + "\\w*)";
. 应该有用。刚刚在regex101.com上测试过。这个\w*
括号内将确保匹配整个单词,而不仅仅是搜索词。它将匹配以word
后跟零个或多个字母字符。