Question

J'essaie actuellement de filtrer un fichier texte qui contient des mots qui sont séparés par un « - ». Je veux compter les mots.

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

Le problème qui se produit est simplement: les mots qui contiennent un « - » va se séparer et compté pour être deux mots. Il suffit donc de sortir avec \ -. N'est pas la solution de choix

Comment puis-je changer le délimiteur d'expression, de sorte que des mots comme « foo-bar » resteront, mais le « - » sera seul filtré et ignoré

?

Merci;)

Était-ce utile?

La solution

OK, je devine à votre question ici: vous voulez dire que vous avez un fichier texte avec une prose « réel », à savoir des phrases qui font réellement sens, sont séparés par la ponctuation, etc., etc., à droite

Exemple:

  

Cette situation est améliorée - pour autant que nous pouvons dire - par le fait que nos alliés les plus fiables, les Vorgons, continuent de tenir leurs concours de slam poésie; l'ennemi a peu d'incitation à interférer avec cela, même avec leurs appareils Mute-O-Matic.

Alors, ce dont vous avez besoin delimiter est quelque chose qui est soit une quantité d'espaces et / ou des signes de ponctuation (que vous avez déjà couvert la regex vous montriez), ou un trait d'union qui est entouré par au moins un des espaces de chaque côté . Le caractère regex pour « ou » est « | ». Il existe un raccourci pour la classe de caractères espaces (espaces, des onglets et des sauts de ligne) dans de nombreuses implémentations de regex:. « \ S »

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

Autres conseils

Si possible, essayez d'utiliser les classes prédéfinies ... rend plus facile à lire l'expression rationnelle. Voir java.util.regex.Pattern pour les options.

Peut-être est ce que vous cherchez:

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

lit comme suit:. Match 1 ou plusieurs caractères d'espacement éventuellement suivie de zéro ou plusieurs caractères non-mot et un caractère d'espacement

Ce n'est pas très simple. Une chose à essayer serait {courant Delimeter-} {caractères zéro ou plus-} {traits d'union zéro ou plus-courant Delimeter-caractères ou trait d'union}.

Il est peut-être plus facile d'ignorer les mots renvoyés par scanner entièrement constitués de traits d'union

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

la méthode suivante (String) affirme que vous obtenez seulement des mots car la méthode useDelimiter () d'origine misses "|"

NB

vous avez utilisé l'expression régulière "\ r \ n | \ n" comme terminaison de ligne. Les JavaDocs pour java.util.regex.Pattern montre d'autres terminaisons de ligne possibles, donc une vérification plus complète utiliserait l'expression "\ r \ n | [\ r \ n \ u2028 \ u2029 \ u0085]"

Cela devrait être assez simple: [^\\w-]\\W*|-\\W+

  • Mais bien sûr, si elle est de la prose, et que vous voulez exclure souligne :
    [^\\p{Alnum}-]\\P{Alnum}*|-\\P{Alnum}+
  • ou si vous ne vous attendez pas numerics:
    [^\\p{Alpha}-]\\P{Alpha}*|-\\P{Alpha}+

EDIT: Ce sont des formes plus faciles. Gardez à l'esprit la solution complète, qui traiterait des tirets au début et à la fin des lignes suivraient ce modèle. (?:^|[^\\w-])\\W*|-(?:\\W+|$)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top