2013-10-21 13 views
8

aşağıdaki iki hat: Niçin `(?! ^)` Ve `(? <! ^)` Üzerine bölme aynı cevabı veriyor? kod

[t, e, s, t] 

bunun bölmek için istekli olmalıdır çünkü

[, t, e, s, t] 

üretilmesi için alt satırında beklenen:

System.out.println(Arrays.toString("test".split("(?<!^)"))); 
System.out.println(Arrays.toString("test".split("(?!^)"))); 

her biri aynı çıktı üretmek ^'dan sonra ve t'dan önce. Birisi benim düşüncemin yanlış olduğunu işaret edebilir mi? (?<!^)(?<!^) gibi, dizenin başında olmayan herhangi bir konumla eşleşir

+0

Aslında, her ikisini de '[t, e, s, t,]' döndürmeyi beklerdim ... –

+2

@TimPietzcker 'split ', varsayılan boşlukları varsayılan olarak yok sayar. Bu - split ("(?

+1

@TimPietzcker: Bu, 'split()' nin oldukça rastgele bir "özelliği" dir, kabul ediyorum. – Keppil

cevap

7

^ ankrajının hiçbir uzunluğu bulunmadığından, ileriye veya geriye bakıp bakmamanız önemli değildir.

| pozisyonları arasında karakter göstermekte olup burada böyle dize test düşünün:

| t | e | s | t | 
^ matches here   ($ matches here) 

(?!^) regex motoru burada zamanlardan dizesiyle "görür" çünkü pozisyon 0 de uymuyor 0 karakterleri

(?<!^) tarafından ileriye bakma, burada regex motoru 0 karakterden geriye doğru bakıldığında dizenin başlangıcını "görmesini" sağladığından

+1

İki durumda farklı regexleriniz var. –

İlgili konular