2011-05-12 26 views
12

Bir Java regex desenim var ve tümüyle eşleştirmek istiyorum bir cümle, ancak bazı sentencecs için hatalı bir şekilde başarısız olur. Bu neden? (Basitlik için, benim karmaşık normal ifadeler kullanabilirsiniz, ama sadece olmaz "*.")Java regex her zaman başarısız oluyor

System.out.println(Pattern.matches(".*", "asdf")); 
System.out.println(Pattern.matches(".*", "[11:04:34] <@Aimbotter> 1 more thing")); 
System.out.println(Pattern.matches(".*", "[11:04:35] <@Aimbotter> Dialogue: 0,0:00:00.00,0:00:00.00,Default,{Orginal LV,0000,0000,0000,,[???]??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????} ")); 
System.out.println(Pattern.matches(".*", "[11:04:35] <@Aimbotter> Dialogue: 0,0:00:00.00,0:00:00.00,Default,{Orginal LV,0000,0000,0000,,[???]????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????} ")); 

Çıktı: Dördüncü cümle arasına u0085 \ 10 unicode kontrol karakterleri içerdiğini

true 
true 
true 
false 

Not Normal yazı tipleriyle gösterilmeyen soru işaretleri. Üçüncü ve dördüncü cümle aslında aynı miktarda karakter içerir!

+0

... –

+0

O http://www.fileformat.info/info/unicode/char (kötü olurdu /85/index.htm) – rurouni

+0

... @ tchrist yakında olacak ve bize java regex motorunun ne kadar bozuk olduğunu anlatacak. – aioobe

cevap

13

kullanılması. kontrol karakterlerini eşleştirmek için Varsayılan olarak yalnızca yazdırılabilir karakterlerle eşleşir. JavaDoc'u itibaren

:

dotall modunda

", ifade bir çizgi sonlandırıcı dahil olmak üzere herhangi bir karakterle, kibrit Varsayılan olarak bu ifade hat sonlandırıcılarını eşleşmiyor

dotall modu da etkinleştirilebilir ... gömülü bayrak ifadesi (lar bu Perl denen şeydir "tek hat" modunda, bir anımsatıcı budur.)"

Kod Kalıbı kodunu (\ u0085 yoktur) (ler?):.

/** 
* Implements the Unicode category ALL and the dot metacharacter when 
* in dotall mode. 
*/ 
static final class All extends CharProperty { 
boolean isSatisfiedBy(int ch) { 
    return true; 
} 
} 

/** 
* Node class for the dot metacharacter when dotall is not enabled. 
*/ 
static final class Dot extends CharProperty { 
boolean isSatisfiedBy(int ch) { 
    return (ch != '\n' && ch != '\r' 
       && (ch|1) != '\u2029' 
       && ch != '\u0085'); 
    } 
} 
+0

Teşekkürler, (? S) çalıştı. Ben Pattern.DOTALL denemedim çünkü farklı derlenmiş bir ton desenim var ve sadece (? S) bir kere kullanmam gerekiyordu (çoğu desende içerdiğim bir dize sabitinde). –

4

cevap soruda gizli: 10 unicode kontrol karakterleri \ u0085

unicode kontrol karakterleri tarafından tanınan öyle * \ n

1

inanıyorum sorun o \ u0085 satırı betimler olduğu gibi.. Çok satırlı eşleme istiyorsanız, Pattern.MULTILINE veya Pattern.DOTALL'u kullanmanız gerekir. Unicode olduğu gerçeği değil - '\ n' de başarısız olur.

kullanmak için:

Pattern.compile(".*",Pattern.DOTALL) 

İsterseniz Pattern.compile(regex, Pattern.DOTALL).matcher(input).matches()

2

Unicode/u0085 yeni satırdır - yani, (?s) - noktayla eşleşen tüm noktaları - regex'inizin başına veya regex'i derlerken bayrağı eklemeniz gerekir. Java Unicode satır sonlandırıcı hakkında bilemeyiz eğer

Pattern.matches("(?s).*", "blahDeBlah\u0085Blah") 
Java Unicode regex motoru olduğu için bu özellikle garip
+1

Değil (? M) '- Çok satırlı mod,'^'ve' $ 'satırların başında/sonunda eşleşmesi anlamına gelir. Singleline modu için '' ('s)' istersiniz. Evet, kafa karıştırıcı (fikir "tüm girdiyi tek bir satır gibi ele almak"). –

+0

Whoops, siz haklısınız efendim. Sabit. –

İlgili konular