2013-05-20 26 views
9

bu programı düşünün: n üst durum versiyonu olduğu içinJava küçük harf duyarsız regex eşleştirme çalışmıyor ile yazmak Ñ

import java.util.regex.Pattern; 
public class xx { 

    /* 
    * Ñ 
    * LATIN CAPITAL LETTER N WITH TILDE 
    * Unicode: U+00D1, UTF-8: C3 91 
    */ 
    public static final String BIG_N = "\u00d1"; 

    /* 
    * ñ 
    * LATIN SMALL LETTER N WITH TILDE 
    * Unicode: U+00F1, UTF-8: C3 B1 
    */ 
    public static final String LITTLE_N = "\u00f1"; 

    public static void main(String[] args) throws Exception { 
     System.out.println(BIG_N.equalsIgnoreCase(LITTLE_N)); 
     System.out.println(Pattern.compile(BIG_N, Pattern.CASE_INSENSITIVE).matcher(LITTLE_N).matches()); 
    } 
} 

, Yazdırmanıza bunu beklenebilir:

true 
true 

ama aslında baskılar (java 1.7.0_17-b02) ne:

true 
false 

Neden?

cevap

15

Büyük/küçük harf duyarlı olmayan eşleme, varsayılan olarak, yalnızca ABD-ASCII karakter kümesindeki karakterlerin eşleştirildiğini varsayar. UNICODE_CASE bayrağını bu bayrakla birlikte belirterek, Unicode uyumlu küçük harf duyarlı eşleştirme etkinleştirilebilir. http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#CASE_INSENSITIVE

ve bütünlüğü için

; Siz ya da (|) bayrakları birlikte.

Pattern.compile(BIG_N, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE) 
+2

D'oh! Eski ABD-ASCII çirkin kafasını yeniden canlandırıyor. Teşekkürler! – Archie

+1

Teşekkürler. Daha önce denedim ama çok erken oldu. Sonra akşam yemeği yemek zamanıydı. Taco gecesi. – Archie

İlgili konular