關於爲什麼以及何時java.lang.String.equalsIgnoreCase
由於錯誤使用語言環境而失敗,有很多很多例子。什麼是Java的equalsIgnoreCase的正確選擇?
但我沒有找到任何正確方法的例子。與java.lang.String.toUpperCase
不同,沒有帶語言環境參數的版本。將兩個字符串轉換爲大寫或小寫似乎都是浪費。特別是當你正在進行大量比較的應用程序時。
在考慮區域設置和性能的情況下,忽略大小寫字符串比較的正確方法是什麼?
關於爲什麼以及何時java.lang.String.equalsIgnoreCase
由於錯誤使用語言環境而失敗,有很多很多例子。什麼是Java的equalsIgnoreCase的正確選擇?
但我沒有找到任何正確方法的例子。與java.lang.String.toUpperCase
不同,沒有帶語言環境參數的版本。將兩個字符串轉換爲大寫或小寫似乎都是浪費。特別是當你正在進行大量比較的應用程序時。
在考慮區域設置和性能的情況下,忽略大小寫字符串比較的正確方法是什麼?
據this page,您可以使用分頁器做區分大小寫平等如下:
//retrieve the runtime user's locale
Locale locale = new Locale(getUserLocale());
//pass the user's locale as an argument
Collator myCollator = Collator.getInstance(locale);
//set collator to Ignore case but not accents
//(default is Collator.TERTIARY, which is
//case sensitive)
myCollator.setStrength(Collator.SECONDARY);
int i = myCollator.compare(stringA,stringB);
(從上述網站複製...)
顯然,在其他情況下你可能會選擇區域設置不同。
For @fge - 此Oracle錯誤報告舉例說明了發生的事情。
感謝您的示例!並花時間來實際找到一些代碼... – fge 2014-10-30 11:57:42
可行的替代方案可能會被濫用正則表達式。這是相當性能密集型與動態變化的字符串,但如果你對常量比較它可能是一種替代方案:
Matcher matcher = Pattern.compile("^" + myOtherString + "$",
Pattern.CASE_INSENSITIVE | Pattern.LITERAL | Pattern.UNICODE_CASE).matcher();
if (matcher.matches(myString)) {
// ...
}
此錨要比較對字符串,指定Unicode的大小寫不敏感字符串的匹配。
我預測會有與使用String.equalsIgnoreCase相同的問題。比較需要區域識別,而不僅僅是支持Unicode。 ('String.equalsIgnoreCase'也是Unicode的意識......根據'String' javadocs。) – 2014-10-30 13:07:13
@StephenC這個很酷的部分是,在你的答案中給出的例子不會有同樣的問題。 ß - > SS問題來自於沒有大寫字母等同於ß的事實。只有ß將匹配ß和ss將**不匹配ß(因爲它發生在equalsIgnoreCase();)中) – Vogel612 2014-10-30 13:21:30
也許通過使用['Collator'](http://docs.oracle.com/javase/8/docs/api/java/text/Collator.html)? – fge 2014-10-30 07:05:40
你介意用'.equalsIgnoreCase()'的錯誤結果來編輯你的問題嗎?我很好奇...... – fge 2014-10-30 07:33:42
@fge土耳其語«我»和德語«ß»似乎是引用最多的失敗。但是你說得對,我稍後添加一些例子。 – Martin 2014-10-30 11:44:35