2011-08-17 12 views
5

Ho un testo e utilizzo questa semplice espressione regolare per dividerlo in parole: [ \n]. Divide il testo in parole usando spazi e interruzioni di riga.Come dividere un testo usando regex, ma le parole divise continuano a mantenere il separatore di espressioni regolari?

Voglio sapere se c'è un modo per mantenere lo spazio bianco o l'interruzione di linea nella parola splitta, perché userò questo per una semplice rilevazione di frase dopo qualche elaborazione.

Sto utilizzando il metodo String#split.

+0

Il tuo \ n significa qualcosa di speciale (fine della frase)? Non stai elaborando i normali paragrafi su più righe con "." come fine della frase? – toto2

+0

@ toto2 Anche la punteggiatura è usata per determinare la fine della frase, ma il contenuto proviene dal contenuto HTML, quindi molte frasi come il titolo non hanno la punteggiatura che determina dove finiscono le frasi, solo l'interruzione di riga. –

+0

Non sono sicuro che dovresti fare affidamento su \ n durante l'elaborazione di HTML, dal momento che potresti avere un documento perfettamente fine senza un singolo \ n. – toto2

risposta

7

È possibile utilizzare lookbehind come @Piotr Findeisen suggerito (+1):

public class RegexExample{ 
    public static void main(String[] args) { 
    String s = "firstWordWithSpaceAfter secondWordWithSpaceAfter wordWithLineBreakAfter\nlastWord"; 
    String sa[] = s.split("(?<=[ \\n])"); 
    for (String saa : sa) 
     System.out.println("[" + saa + "]"); 
    } 
} 

uscita:

[firstWordWithSpaceAfter ] 
[secondWordWithSpaceAfter ] 
[wordWithLineBreakAfter 
] 
[lastWord] 

Breve spiegazione:

?<= è guardare dietro, il che significa che hai un corrisponde se i dati prima dell'espressione che stai cercando sono uguali alla regex successiva a ?<= (in questo caso [ \\n])

[ \\n] è espressione regolare che significa uno dei personaggi nel []

così tutta la regex dice diviso ogni volta che il personaggio prima che l'espressione/parola è uno spazio o \n.

Poiché non abbiamo provato a trovare lo spazio o \n, non li rimuoverò.

+0

Sembra funzionare, ma ... puoi spiegare la regex? –

+0

@Renato Dinhani Conceição - Non sono un esperto di regex, ma spero che la modifica sia abbastanza chiara. – MByD

+0

Hai messo la tua espressione regolare tra parentesi. Questo è necessario? –

5

Considera l'uso di una vista positiva di larghezza zero/lookahead. Vedere Pattern javadoc intorno costrutti speciali (non cattura)

0

penso che l'unica opzione è quella di fare qualcosa di simile:

String myString = "Joe Blow\n1234 Fake Road\nHere, There, 12345"; 
String[] lines = myString.split("\\n"); 
Set<String[]> wordsByLine = new LinkedHashSet<String[]>(); 
for (String line : lines) { 
    wordsByline.add(line.split(" ")); 
} 
0

molto velocemente fuori dalla parte superiore della mia testa, se l'espressione regolare è stata sempre la corrispondenza singoli caratteri, è possibile utilizzare la lunghezza per determinare dove si sono seduti nella stringa originale. Quindi puoi prendere una sottostringa per il carattere di delimitazione.

Bit sporco, ma dovrebbe fare il trucco.

-1

Non sono ancora sicuro di cosa si sta provando a fare, ma se \ n ha un significato diverso da di "", è necessario gestirli separatamente.

String[] sentences = text.split("\\n"); 
... 
for (String sentence : sentences) { 
    ... 
    String[] words = sentence.split(" "); 
    ... 
} 
Problemi correlati