如何在不考虑空格的情况下比较java中的两个字符串?

vij*_*ayk 20 java string

我有一个例子.

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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

NIN*_*OOP 30

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

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

然后比较.

  • @RohitJain错了!您可以使用带有字符序列(`“”`)的`replace()`或带有正则表达式的`replaceAll()`来解决此问题。 (2认同)

Zol*_*tán 16

我认为用空字符串替换所有空格会导致验证以下情况的危险(找到两个相同的名称):

String a = "ANN MARIE O'RIORDAN"
String b = "ANNMARIE O'RIORDAN"
Run Code Online (Sandbox Code Playgroud)

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

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

if (a.trim().replaceAll("\\s+", " ").equalsIgnoreCase(b.trim().replaceAll("\\s+", " "))) {
    // Strings equivalent
}
Run Code Online (Sandbox Code Playgroud)

思考?


sev*_*rce 13

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

为了使用第三方库的功能,我建议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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

收益:

'VIJAY KAKADE' and 'VIJAY    KAKADE' matching: yes
'VIJAY KAKADE' and 'VIJAYKAKADE' matching: no
Run Code Online (Sandbox Code Playgroud)


Roh*_*ain 12

用空字符串替换空格:

if (a.replace(" ", "").equalsIgnoreCase(b.replace(" ", "")))
Run Code Online (Sandbox Code Playgroud)

  • 如果`a ="ANN MARIE"`和`b ="ANNMARIE"`怎么办?它们的名称不一样,但是这个解决方案会对它们进行评估.请在下面考虑我的答案. (2认同)