2016-04-03 1 views
1

Je travaille sur une grande mission de données pour l'école et pour faire fonctionner mon code, j'ai besoin de filtrer les mots d'un fichier texte. Bien sûr, je lis le fichier et filtre les choses dont je n'ai pas besoin avec replaceAll ("[^ a-zA-Z0-9]", "");Java filtre les mots hors du fichier, même si rare aucun espace se produisent

Mais cela pose un problème. Parce que je filtre sur les espaces et il y a quelques cas particuliers comme:

wobbewy!'--'Wobbewy,' 

Je reçois des mots comme:

wobbewywobbewy 

Y at-il de toute façon de filtrer les mots sur les espaces et filtrer aussi ces cas particuliers sans faire comme une énorme quantité de déclarations si?

code Exemple de ce qui se passe après avoir essayé le correctif:

while ((thisLine = bufferedReader.readLine()) != null) { 
     String[] woord = thisLine.toString().trim().split("\\s+"); 
     for(int i=0; i<woord.length; i++){ 
      normalWord = woord[i].replaceAll("[^a-zA-Z]+", " "); 
      normalWord = normalWord.toLowerCase(); 

Puis-je obtenir outpuit comme:

xxv (espaces multiples) mon

+1

Pourquoi ne pas utiliser ("[^ a-zA-Z0-9]", ""), donc! '-' sera remplacé par un espace et la séparation par espace fonctionnera. Alternativement: Ne remplacez rien et recherchez les mots en utilisant regex, par exemple en utilisant le motif \ w +. – kevcodez

+0

Bien sûr, tout ce problème est bien pire lorsqu'il s'agit de langages qui n'utilisent pas les espaces pour séparer les mots. Dans certaines langues (thaï, IIRC?), Casser simplement un bloc de texte en mots nécessite un dictionnaire et un algorithme de retour arrière récursif. –

Répondre

0

de Split consomme entrée, alors divisée sur « non mot » caractères:

String[] woord = thisLine.trim().split("[^a-zA-Z0-9']+"); 

Avis J'ajouté lapostrophe aux caractères de garder, ce qui laissera des mots comme « ne pas » être traité comme un seul mot .

1

Lors de la suppression des caractères spéciaux, vos informations à propos des frontières de mots se perd.

Remplacez replaceAll("[^a-zA-Z0-9]", ""); par replaceAll("([^a-zA-Z0-9]|\s)+", " "); (remplacez les caractères spéciaux et les espaces blancs par un seul espace).

+0

Cela créerait cinq espaces pour l'exemple de l'OP. Je préférerais '" [^ a-zA-Z0-9] + "', puis je diviserais par espace. – nyname00

+0

@ nyname00 Je mis à jour ma réponse – slartidan

+0

Cet exemple ne fonctionne pas et donne une erreur =) pourrait me être bien mais comment cela fonctionnerait dans un scénario suivant ?: while ((thisLine = bufferedReader.readLine())! = null) { \t Chaîne [] woord = thisLine.toString(). trim(). replaceAll ("([^ a-zA-Z0-9] | \\ s) +", ""); \t for (int i = 0; i Tvt