2017-04-04 279 views
0

我使用.equals下面String比较,但x不匹配"OU"String.equals比较匹配失败

String memberOfValue="CN=cn,​OU=ou,​OU=roles,​OU=de,​OU=apps,​DC=meta,​DC=cc,​DC=com"; 
String[] pairs = memberOfValue.split(","); 
for (int i=0;i<pairs.length;i++) { 
    String pair = pairs[i]; 
    String[] keyValue = pair.split("="); 
    System.out.println(keyValue[0]); 
    String x = keyValue[0]; 
    String y = "OU"; 
    System.out.println(x); 
    System.out.println(x.equals(y)); 
} 

我要去哪里错了?

+7

定义“不工作”。你期待什么行为?你在看什么? –

+0

一个无关的注释:'for'循环可以用一个更简单的“foreach”循环替换:'for(String pair:pairs){...}'。 –

+0

如果你试图解析[LDAP](https://tools.ietf.org/html/rfc4511)消息,你将需要比'String.split'更多的东西。除非这是一次性任务或者非常小的项目,否则你应该找一个已经为你处理奇怪角落案例的免费库(Apache提供了一个)。例如,您的输入字符串是否无效,或者是否允许包含该Unicode零宽度空格字符?我不知道,但它是在某个地方定义的,(可能)由预先存在的库处理。我相信还有更多像这样的惊喜。 –

回答

0

从我看到的有两个可能的问题。

A.)如果字符串不同的资本,除非你使用的方法.equalsIgnoreCase(他们将不会返回相等),而不是.equals()

B.)你没有得到正确的字符串,你我期待着。一定要打印出或调试通过哪些字符串进行分析。

5

添加的这两行代码显示问题:

System.out.println("x: " + x + " - " + x.chars().boxed().collect(Collectors.toList())); 
System.out.println("y: " + y + " - " + y.chars().boxed().collect(Collectors.toList())); 

它给

x: ​OU - [8203, 79, 85] 
y: OU - [79, 85] 

这都说明你有一些无形的焦炭,其整数值是8203(零宽度的空间,看What's HTML character code 8203? )在你的字符串中。不知道你是怎么得到的。

+0

总得恨那些在文本中插入隐形字符的笨拙文本编辑器。然而,解决方案非常简单:**使用IDE **。它们是为了编程而制作的,不会像这样做。 – Andreas

1

由于@JB Nizet说,你有非打印字符memberOfValue变量,也有一些类型的字符,例如:

control, format, private use, surrogate, unassigned, etc... 

下面是完整的列表:http://www.fileformat.info/info/unicode/category/index.htm

\\P{Print}

例如:

在这种情况下,你可以从你的字符串使用正则表达式删除所有字符

String x = keyValue[0].replaceAll("[\\P{Print}", ""); 

当您再次比较字符串时,结果将是正确的。