2017-04-04 464 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}", ""); 

當您再次比較字符串時,結果將是正確的。