/ / Dividi una stringa e separa con la punteggiatura e gli spazi bianchi - java, regex, split

Dividere una stringa e separarla con punteggiatura e spazi bianchi: java, regex, split

Ho alcune stringhe, ad esempio: I: am a string, with "punctuation". Voglio dividere la stringa come:

["I", ":", "am", "a", "string", ",", "with", """, "punctuation", """, "."]

Provai text.split("[\p{Punct}\s]+") ma il risultato è I, am, a, string, with, punctuation ...

ho trovato Questo soluzione ma Java non mi permette di dividere w .

risposte:

6 per risposta № 1

Usa questa espressione regolare:

"\s+|(?=\p{Punct})|(?<=\p{Punct})"

Il risultato sulla tua stringa:

["I", ":", "am", "a", "string", ",", "with", "", """, "punctuation", """, "."]

Sfortunatamente, c'è un elemento in più, il "" dopo il con. Questi elementi extra si verificano solo (e si verificano sempre) quando c'è un carattere di punteggiatura dopo un carattere di spazio bianco, quindi questo potrebbe essere risolto facendo myString.replaceAll("\s+(?=\p{Punct})", "").split(regex); invece di myString.split(regex); (cioè spogliare gli spazi bianchi prima di dividere)

Come funziona:

  • \s+ si divide in un gruppo di spazi bianchi, quindi se i caratteri sono caratteri di spaziatura, rimuoveremo quei caratteri e li separeremo in quella posizione. (nota: presumo che una stringa di hello world dovrebbe comportare ["hello", "world"] piuttosto che ["hello", "", "world"])
  • (?=\p{Punct}) è un lookahead che si divide se il carattere successivo è un carattere di punteggiatura, ma non rimuove il personaggio.
  • (?<=\p{Punct}) è un lookbehind che si divide se l'ultimo carattere è un carattere di punteggiatura.

MODIFICARE:

In risposta a il tuo commento, questa espressione regolare dovrebbe consentire la punteggiatura all'interno delle parole:

"\s+|(?=\W\p{Punct}|\p{Punct}\W)|(?<=\W\p{Punct}|\p{Punct}\W})"

Per questo, non è necessario utilizzare il replaceAll, semplicemente myString.split(regex).

Come funziona:

Questa regex è molto simile, ma i lookaround sono cambiati. \W\p{Punct} corrisponde a un carattere non parola seguito da un carattere di punteggiatura. \p{Punct}\W corrisponde a un carattere di punteggiatura seguito da un carattere diverso da una parola. Quindi ogni rimedio coincide se c'è un carattere di punteggiatura che non è nel mezzo di una parola.


0 per risposta № 2

Oppure prova questo, colleziona in un ArrayList:

    String s = "I: am a string, with "punctuation".";
Pattern pat = Pattern.compile( "\w+|\S" );

Matcher mat = pat.matcher( s );
while( mat.find() ){
System.out.print( mat.group() +  "/" );
}
System.out.println();

Produzione:

 I/:/am/a/string/,/with/"/punctuation/"/./