Java 从列表中找到部分匹配的字符串
Java find partially matching string from list
所以我使用 google 相机 api 创建光学文本 reader 用于 OCR。从相机读取时,我想通过将读取的字符串与字符串列表进行匹配来过滤读取的字符串,如果读取的字符串部分匹配,则会添加并显示列表中的项目。
除过滤外的一切都有效。
假设我有一个包含字符串的列表:
"BigSizeScrew 45**"
我要匹配读取的字符串:
"BigSizeScrew"
...到有数字的那个,然后添加包含数字的字符串。
数字和星星是另外一个原因,但必须保留,原因与问题无关。
tl;博士:
如何将字符串部分匹配到列表中的现有字符串?
我有以下内容,但它专门搜索 100% 匹配的字符串,如果检查的字符串包含读取字符串的子字符串,则不会。
for(int i =0;i<items.size();++i){
if (list.contains(items.valueAt(i))) {
TextBlock item = items.valueAt(i);
stringBuilder.append(item.getValue());
stringBuilder.append("\n");
}
}
编辑:
该列表包含大约 200 个应该可以部分匹配的不同字符串。但都以同样的方式;部分匹配主字符串但不匹配 numbers/stars.
您可以通过添加 if
条件来执行类似的操作:
for(int i =0;i<items.size();++i){
if (list.contains(items.valueAt(i))) {
TextBlock item = items.valueAt(i);
if(item.getValue().indexOf("Your String") > -1){
stringBuilder.append(item.getValue());
stringBuilder.append("\n");
}
}
}
使用您要搜索的字符串值代替 your string
。
使用indexOf()方法。方法索引给出匹配字符串的索引。所以它的值大于-1,这意味着搜索字符串存在于列表中,你可以使用该字符串。
可以使用String
的startsWith
方法。如果 ocrString
的值为 BigSizeScrew 45**
则执行一个 for
循环到包含要匹配的字符串的列表,并且 if(ocrString.startsWith(list.get(i)) then ...
.
我认为您可能真的想要一个模糊句子匹配器。如果字母没有被光学器件捕捉到,您将需要对它们可能是什么进行插值。它进入了 NLP,但可能是正确的实施方式。
这是 Smith-Waterman 维基百科的 link:https://en.wikipedia.org/wiki/Smith%E2%80%93Waterman_algorithm
Leveshtein 距离:
https://en.wikipedia.org/wiki/Levenshtein_distance
有多种实现和库可以对读取的每个语句执行单个函数调用。 "Local sentence alignment" 是您要解决的问题。涉及屏幕阅读器时忘记完全匹配,预计人为和计算机错误。
所以我使用 google 相机 api 创建光学文本 reader 用于 OCR。从相机读取时,我想通过将读取的字符串与字符串列表进行匹配来过滤读取的字符串,如果读取的字符串部分匹配,则会添加并显示列表中的项目。
除过滤外的一切都有效。
假设我有一个包含字符串的列表:
"BigSizeScrew 45**"
我要匹配读取的字符串:
"BigSizeScrew"
...到有数字的那个,然后添加包含数字的字符串。
数字和星星是另外一个原因,但必须保留,原因与问题无关。
tl;博士:
如何将字符串部分匹配到列表中的现有字符串?
我有以下内容,但它专门搜索 100% 匹配的字符串,如果检查的字符串包含读取字符串的子字符串,则不会。
for(int i =0;i<items.size();++i){
if (list.contains(items.valueAt(i))) {
TextBlock item = items.valueAt(i);
stringBuilder.append(item.getValue());
stringBuilder.append("\n");
}
}
编辑:
该列表包含大约 200 个应该可以部分匹配的不同字符串。但都以同样的方式;部分匹配主字符串但不匹配 numbers/stars.
您可以通过添加 if
条件来执行类似的操作:
for(int i =0;i<items.size();++i){
if (list.contains(items.valueAt(i))) {
TextBlock item = items.valueAt(i);
if(item.getValue().indexOf("Your String") > -1){
stringBuilder.append(item.getValue());
stringBuilder.append("\n");
}
}
}
使用您要搜索的字符串值代替 your string
。
使用indexOf()方法。方法索引给出匹配字符串的索引。所以它的值大于-1,这意味着搜索字符串存在于列表中,你可以使用该字符串。
可以使用String
的startsWith
方法。如果 ocrString
的值为 BigSizeScrew 45**
则执行一个 for
循环到包含要匹配的字符串的列表,并且 if(ocrString.startsWith(list.get(i)) then ...
.
我认为您可能真的想要一个模糊句子匹配器。如果字母没有被光学器件捕捉到,您将需要对它们可能是什么进行插值。它进入了 NLP,但可能是正确的实施方式。
这是 Smith-Waterman 维基百科的 link:https://en.wikipedia.org/wiki/Smith%E2%80%93Waterman_algorithm
Leveshtein 距离: https://en.wikipedia.org/wiki/Levenshtein_distance
有多种实现和库可以对读取的每个语句执行单个函数调用。 "Local sentence alignment" 是您要解决的问题。涉及屏幕阅读器时忘记完全匹配,预计人为和计算机错误。