30

我有一个例子。

public class Test {
    public static void main(String[] args) {
        String a="VIJAY KAKADE";
        String b="VIJAY    KAKADE";
        if(a.equalsIgnoreCase(b)){
            System.out.println("yes");
        }else{
            System.out.println("no");
        }
    }
}

我需要检查这些字符串而不考虑空格。我如何实现这一目标?比较字符串时如何忽略字符串中的空格?

4

9 回答 9

39

您可以尝试通过替换所有空格来创建新字符串。

if(a.replaceAll("\\s+","").equalsIgnoreCase(b.replaceAll("\\s+",""))) {
   // this will also take care of spaces like tabs etc.
}

然后比较。

于 2013-07-31T15:02:44.757 回答
22

我认为用空字符串替换所有空格会带来验证以下情况的危险(发现两个名称相等):

String a = "ANN MARIE O'RIORDAN"
String b = "ANNMARIE O'RIORDAN"

我知道我可能会在这里分裂头发,但是我在寻找类似的解决方案来验证单元测试中的 SQL 查询时发现了这个问题。因为我的查询是多行的static final Strings,所以我想确保我没有错过任何地方的空格。

为此,我认为用单个空格或特殊字符替换所有空格是最安全的解决方案 - 然后确实需要正则表达式:

if (a.trim().replaceAll("\\s+", " ").equalsIgnoreCase(b.trim().replaceAll("\\s+", " "))) {
    // Strings equivalent
}

想法?

于 2013-12-04T10:11:14.580 回答
14

正如佐尔坦正确指出的那样,除他之外的所有答案实际上都是错误的。

对于使用第三方库的功能,我建议hamcrest

import static org.hamcrest.text.IsEqualIgnoringWhiteSpace.equalToIgnoringWhiteSpace;

public class Main {
    public static void main(String[] args) {
        String a = "VIJAY KAKADE";
        String b = "VIJAY    KAKADE";
        System.out.print(String.format("'%s' and '%s' matching: ", a, b));
        if (equalToIgnoringWhiteSpace(a).matches(b)) {
            System.out.println("yes");
        } else {
            System.out.println("no");
        }

        String c = "VIJAYKAKADE";
        System.out.print(String.format("'%s' and '%s' matching: ", a, c));
        if (equalToIgnoringWhiteSpace(a).matches(c)) {
            System.out.println("yes");
        } else {
            System.out.println("no");
        }
    }
}

返回:

'VIJAY KAKADE' and 'VIJAY    KAKADE' matching: yes
'VIJAY KAKADE' and 'VIJAYKAKADE' matching: no
于 2015-09-13T13:05:45.180 回答
12

用空字符串替换空格:

if (a.replace(" ", "").equalsIgnoreCase(b.replace(" ", "")))
于 2013-07-31T15:02:02.180 回答
2

如果要替换所有空格,包括制表符等,可以使用

a = yourOriginalString.replaceAll("\\s", "");
b = yourOriginalString.replaceAll("\\s", "");
return a.equalsIgnoreCase(b);

编辑:哇忍者想见鬼

于 2013-07-31T15:07:56.340 回答
1

您可以使用String.replace()删除两个字符串中的空格。

  String aMod = a.replace(" ","");
  String bMod = b.replace(" ","");
  if( aMod.equalsIgnoreCase(bMod) ){
     ... 
于 2013-07-31T15:03:39.833 回答
1

String#replace()方法对您很有帮助。

public static void main(String[] args) {
    String a="VIJAY KAKADE";
    String b="VIJAY    KAKADE";
    a = a.replace(" ", "");
    b = b.replace(" ", "");
    if(a.equalsIgnoreCase(b)){
        System.out.println("yes");
    }else{
        System.out.println("no");
    }
}
于 2013-07-31T15:04:40.517 回答
1
a.replace(" ","")

是你最好的选择。但是, a.trim() 如果您知道只想忽略前导和尾随空格,则可以使用它来删除前导和尾随空格。此外,来自 apache commons 的 StringUtils 还有更多功能可以提供帮助

于 2013-07-31T15:09:52.053 回答
1
public static void main(String args[]) {
    String a = "My Name is A B";
    String b = "My Name is A    B";

    System.out.println("Match = " + equalsIgnoreSpace(a, b, false));
}

static boolean equalsIgnoreSpace(String s1, String s2, boolean matchCase) {

   String val1 = stripExtraSpaces(s1);
   String val2 = stripExtraSpaces(s2);

   if(matchCase) {
       return val1.equals(val2);
   } else {
       return val1.equalsIgnoreCase(val2);
   }
}

static String stripExtraSpaces(String s) {
    String formattedString = "";
    java.util.StringTokenizer st = new java.util.StringTokenizer(s);

    while(st.hasMoreTokens()) {
        formattedString += st.nextToken() + " ";
    }

    return formattedString.trim();
}
于 2018-02-04T16:46:52.117 回答