Domanda

Al momento sto cercando di filtrare un file di testo che contiene le parole che sono separati con un "-". Voglio contare le parole.

scanner.useDelimiter(("[.,:;()?!\" \t\n\r]+"));

Il problema che si verifica è semplicemente: parole che contengono un "-" andranno separate e contate per essere due parole. Quindi, solo fuggire con \ -. Non è la soluzione ideale

Come posso cambiare il delimitatore-espressione, in modo che parole come "foo-bar" rimarrà, ma il "-" da solo saranno filtrati e ignorato

?

Grazie;)

È stato utile?

Soluzione

OK, sto cercando di indovinare a vostra domanda qui: Vuoi dire che hai un file di testo con un po 'di prosa "vero", vale a dire le frasi che in realtà hanno un senso, sono separate da punteggiatura e simili, ecc, giusto

Esempio:

  

Questa situazione è migliorata - per quanto possiamo dire - dal fatto che i nostri alleati più fidati, il Vorgons, continuano a tenere le loro gare Poetry Slam; il nemico ha poco incentivo a interferire con che, anche con i loro dispositivi Mute-O-Matic.

Quindi, quello che vi serve come delimitatore è qualcosa che è o qualsiasi quantità di spazi e / o segni di punteggiatura (che avete già coperto con la regex hai mostrato), o un trattino che è circondata da almeno uno spazio bianco su ogni lato . Il carattere regex per "o" è "|". C'è una scorciatoia per la classe di caratteri spazi bianchi (spazi, tabulazioni e ritorni a capo) in molte implementazioni regex:. "\ S"

"[.,:;()?!\"\s]+|\s+-\s+"

Altri suggerimenti

Se possibile cercare di utilizzare le classi predefinite ... rende l'espressione regolare molto più facile da leggere. Vedere java.util.regex.Pattern per le opzioni.

Forse questo è quello che stai cercando:

string.split("\\s+(\\W*\\s)?"

Letture:. Corrispondenza 1 o caratteri più spaziatura eventualmente seguita da zero o più caratteri non parola e uno spazio bianco

Questo non è molto semplice. Una cosa da provare sarebbe {current-delimeter-chars} {zero o-più-trattini} {zero o-più-corrente-delimeter-caratteri-o-trattino}.

Potrebbe essere più facile da ignorare semplicemente le parole restituiti da scanner sono costituiti integralmente da trattini

Scanner scanner = new Scanner("one   two2  -   (three) four-five - ,....|");
scanner.useDelimiter("(\\B+-\\B+|[.,:;()?!\" \t|])+");

while (scanner.hasNext()) {
    System.out.println(scanner.next("\\w+(-\\w+)*"));
}

NB

il metodo next (String) afferma che si ottiene solo parole dal momento che l'useDelimiter originale () metodo manca "|"

NB

è stata utilizzata l'espressione regolare "\ r \ n | \ n" come terminatore di linea. I JavaDocs per java.util.regex.Pattern mostrano altre possibili terminatori di linea, quindi un controllo più completo avrebbe usato l'espressione "\ r \ n | [\ r \ n \ u2028 \ u2029 \ u0085]"

Questa dovrebbe essere una abbastanza semplice: [^\\w-]\\W*|-\\W+

  • Ma, naturalmente, se è la prosa, e si desidera escludere sottolinea :
    [^\\p{Alnum}-]\\P{Alnum}*|-\\P{Alnum}+
  • o se non ti aspetti numerici:
    [^\\p{Alpha}-]\\P{Alpha}*|-\\P{Alpha}+

Modifica Queste sono forme più semplici. Tenete a mente la soluzione completa, che avrebbe gestito trattini all'inizio e alla fine delle linee avrebbe seguito questo schema. (?:^|[^\\w-])\\W*|-(?:\\W+|$)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top