如何在忽略特定字符的同时比较字符串

时间:2019-05-13 22:40:51

标签: java android

我知道这上有类似的线程,但是其中大多数只涉及忽略空格。

我必须使用一些写得不好的数据表来编写应用程序,因此我经常必须比较以下内容: 包,包,包,包,包

这些都应该视为相等,因为它们都是包装。但是,制作这些数据表的人都没有相互通信,所以现在我开始处理它。

如何在忽略括号,空格,'s'字符的同时比较字符串,并在比较之前确保所有内容均为小写?

我现在所拥有的就是这个:

private boolean sCompare(String s1, String s2)
{


   return s1.equalsIgnoreCase(s2)
}

很明显,除了直接比较两个小写字符串之外,它没有什么用,也没有做任何其他事情,但是我不确定要获得所需结果的正确方法。

对于上面的示例,新的比较函数应该返回true,而在比较诸如Pack和Case,Pack和Case等之类的事物时,则返回false。

编辑 借助最佳答案的帮助,我创建了一个满足自己需求的功能

private boolean sCompare(String s1, String s2)
{
    String rx = "[\\se(s)|s$]";
    return (s1.toLowerCase().replaceAll(rx,"")).equals(s2.toLowerCase().replaceAll(rx,""));
}

3 个答案:

答案 0 :(得分:1)

此:

public static void main(String[] args) throws Exception {
    String REGEX = "\\(s\\)|s$";

    System.out.println("Packs".replaceAll(REGEX, "")
                              .toLowerCase());
    System.out.println("packs".replaceAll(REGEX, "")
                              .toLowerCase());
    System.out.println("Pack(s)".replaceAll(REGEX, "")
                                .toLowerCase());
    System.out.println("pack(s)".replaceAll(REGEX, "")
                                .toLowerCase());
    System.out.println("pack".replaceAll(REGEX, "")
                             .toLowerCase());
}

收益:

pack
pack
pack
pack
pack

所以应该这样做:

private static boolean sCompare(String s1, String s2) {
    return discombobulate(s1).equals(discombobulate(s2));
}

private static String discombobulate(String s) {
    String REGEX = "\\(s\\)|s$";

    return s.replaceAll(REGEX, "")
            .toLowerCase();
}

答案 1 :(得分:0)

嗨,我认为这可以回答您的问题:)只需添加另一个禁止的字符来设置,它也会简单地过滤该字符。

   Set<Character> forbiddenChars = Set.of('s', '{', '}', ' ');

        String testString = "This Is{ Test} string";

        String filteredString = testString
                                        .toLowerCase()
                                        .codePoints()
                                        .filter(character -> !forbiddenChars.contains((char)character))
                                        .collect(StringBuilder::new, StringBuilder::appendCodePoint,
                                                    StringBuilder::append)
                                        .toString();
        System.out.println(filteredString);

答案 2 :(得分:0)

您可以使用:

s1.replaceAll("\\W|s\\)?$", "").equals("pack"); // true

或:

s1.replaceAll("\\W|s", "").equals("pack"); // true

如果您不关心字符串中的任何其他 s 字符。

“ \ W | s \)?$” 将删除所有非单词字符和末尾的任何 s

如果您知道最后一个单词中没有其他 s ,则可以使用以下简化表达式:“ \ W | s” 。它将删除所有不是单词字符和字符串中任何s的东西。