检查子字符串是否在忽略大写,小写和特殊字符的字符串中?

时间:2020-02-29 18:32:37

标签: java string substring contains

我正在尝试检查是否有“自制披萨!”之类的短语。包含“ 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));
    }
}

2 个答案:

答案 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_CLASSCASE_INSENSITIVEUNICODE_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]
相关问题