2015-07-28 12 views
12

La funzionalità di divisione sembra essere diversa tra Java e JavaScript.Comportamento diviso tra Java e JavaScript

Non ho esattamente bisogno di abbinare un determinato criterio di espressione regolare, o usare espressioni regolari basate su lookahead. Il mio problema risiede nelle partite vuote che vengono seguite dopo la corrispondenza finale della regex divisa (che è un semplice set di caratteri e non un'espressione).

Di seguito è riportato un esempio dell'output che sto cercando di ottenere e che cosa sto ottenendo davvero.

Java

("~#~~#~~#~A~#~B~#~C~#~D~#~E~#~~#~~#~").split("~#~") 

/* results with an array of length 8 */ (java.lang.String[]) [, , , A, B, C, D, E] 

Javascript

"~#~~#~~#~A~#~B~#~C~#~D~#~E~#~~#~~#~".split("~#~") 
/* results with an array of length 11 */ ["", "", "", "A", "B", "C", "D", "E", "", "", ""] 

davvero non riesco a mettere le mani su una buona spiegazione per questo, come sto lavorando con un'applicazione Java e la divisione è mi crea problemi, voglio lo stesso risultato di JavaScript. Come posso averlo?

+27

Nonostante le similitudini nome (forse la decisione più stupida di sempre), sono in realtà diverse lingue. Scoprirai che anche il 'split' in C funziona in modo diverso (lamentandosi di non riuscire a trovarlo, soprattutto). – paxdiablo

+6

Come è logico che Java ometti le stringhe vuote alla fine della divisione, ma non quelle prepensionanti? Il risultato che Javascript ti dà ha molto più senso. – connexo

+6

@connexo: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split%28java.lang.String%29: "Le stringhe vuote finali non sono quindi incluse nel array risultante. – paxdiablo

risposta

30

Javadoc su split(String regex):

Questo metodo funziona come se richiamando il metodo split due argomenti con l'espressione data e un argomento limite pari a zero. Le stringhe vuote finali non sono quindi incluse nell'array risultante.

Javadoc su split(String regex, int limit):

Se n non è positiva, allora il modello viene applicato come numero di volte possibile e la matrice può avere qualsiasi lunghezza. Se n è zero, il pattern verrà applicato il maggior numero di volte possibile, l'array può avere una lunghezza qualsiasi e le stringhe vuote verranno eliminate.

Quindi ... split("~#~", -1) dovrebbe fare il trucco.

1

La documentazione di Java split() indica chiaramente che le stringhe vuote finali saranno NON da includere.

Questo metodo funziona come se richiamando il metodo split due argomenti con l'espressione data e un argomento limite pari a zero. Le stringhe vuote non sono quindi incluse nell'array risultante.

7

La documentazione split() di Java indica chiaramente che le stringhe vuote finali NON saranno incluse.

Questo metodo funziona come se richiamando il metodo split due argomenti con l'espressione data e un argomento limite pari a zero. Le stringhe finali vuote non sono quindi incluse nell'array risultante.

ma si può raggiungere da

("~#~~#~~#~A~#~B~#~C~#~D~#~E~#~~#~~#~").split("~#~" , -1) 

che è un metodo di overload