我正在尝试检查是否有“自制披萨!”之类的短语。包含“ pizza”之类的字符串,但是我希望它始终为真,是Pizza,Pizza还是Pizza都没关系!或披萨!
我将解释代码:
recipesFounded
是一个包含标题,描述等的数组。这就是为什么我放置recipesFounded.get(i).getTitle()
。
问题是我有“自制披萨!”字符串,所以如果我搜索“ Pizza!”很好,因为该食谱已添加到trueOnes
新食谱列表中,但是如果我搜索披萨(没有mayus P和!),则不会。
单词是我要搜索的字符串(比萨,比萨!... )
for (int i=0; i < recipesFounded.size(); i++) {
if (recipesFounded.get(i).getTitle().contains(word)) {
trueOnes.add(recipesFounded.get(i));
}
}
答案 0 :(得分:3)
使用toLowerCase
的{{1}}方法
String
根据 Andreas 建议,在循环之前将单词转换为小写。效率更高。
word = word.replaceAll("[^a-zA-Z]","").toLowerCase(); // keep only letters
由于for (int i=0; i < recipesFounded.size(); i++) {
if (recipesFounded.get(i).getTitle().toLowerCase()
.contains(word)) {
trueOnes.add(recipesFounded.get(i));
}
}
实现了List
接口,因此您可以这样做。假定您正在使用名为iterable
Recipe
答案 1 :(得分:2)
为了以给定的顺序搜索字母/数字,而忽略大小写,空格和特殊字符,最好将搜索字符串转换为正则表达式。
要允许搜索字符串"foobar"
与"Foo-Bar"
匹配,我们需要在任何字母数字字符之间允许特殊字符。
对于完整的Unicode支持,我们将使用\p{Alnum}
和标志UNICODE_CHARACTER_CLASS
,CASE_INSENSITIVE
和UNICODE_CASE
,对于非字母数字则使用大写的P
。
匹配例如A
与Á
,我们还使用Normalizer.normalize(str, Normalizer.Form.NFD)
分解 Unicode字符。
以下是如何执行此操作的示例:
static List<String> search(List<String> texts, String word) {
String regex = Normalizer.normalize(word, Normalizer.Form.NFD) // e.g. "Á" -> "A\u0301"
.replaceAll("(?U)\\P{Alnum}+", "") // e.g. "I'm!" -> "Im"
.replaceAll("(?<=.)(?=.)", "\\\\P{Alnum}*"); // insert '\\P{Alnum}*' between all characters
Pattern p = Pattern.compile(regex, Pattern.UNICODE_CHARACTER_CLASS |
Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
List<String> trueOnes = new ArrayList<>();
for (String text : texts) {
if (p.matcher(Normalizer.normalize(text, Normalizer.Form.NFD)).find()) {
trueOnes.add(text);
}
}
return trueOnes;
}
测试
List<String> texts = List.of("Homemade Pizza!", "Dessert", "Pizza Hut", "Potato-Söûp", "O'Malleys Ale");
System.out.println(search(texts, "pizza")); // [Homemade Pizza!, Pizza Hut]
System.out.println(search(texts, "made, pi")); // [Homemade Pizza!]
System.out.println(search(texts, "ömÁl")); // [O'Malleys Ale]
System.out.println(search(texts, "TOSO")); // [Potato-Söûp]