我知道这上有类似的线程,但是其中大多数只涉及忽略空格。
我必须使用一些写得不好的数据表来编写应用程序,因此我经常必须比较以下内容: 包,包,包,包,包
这些都应该视为相等,因为它们都是包装。但是,制作这些数据表的人都没有相互通信,所以现在我开始处理它。
如何在忽略括号,空格,'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,""));
}
答案 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的东西。