2009-04-03 8 views
3

J'essaye de trouver une regex pour enlever tous les mots qui contiennent des caractères non-mot. Donc, s'il contient un deux-points, une virgule, un nombre, un crochet, etc., supprimez-le de la ligne, pas seulement le caractère mais le mot. J'ai ceci jusqu'ici. Il ne doit pas nécessairement être parfait, donc supprimer les chaînes avec un tiret et une apostrophe est correct.Comment puis-je supprimer tous les jetons avec des caractères non-mots en Perl?

+0

Comment un mot peut-il contenir des caractères non-mots? – MarkusQ

+0

Dans le contexte des expressions régulières, les caractères "non-mots" incluent des traits d'union (par exemple, un trait rapide) et des apostrophes (par exemple, ne pas faire). – Telemachus

Répondre

2
s/\w*([^\w\s]|\d)+\w* ?//g; 
+0

Pourquoi pas \ W au lieu de^\ w? Juste curieux s'il y avait une raison spécifique. – Telemachus

+0

Oui, \ W rattrape les espaces,^\ w \ s ne le fait pas. –

+0

@Telemachus: parce qu'il veut aussi exclure les caractères d'espace. \ W inclurait des espaces. – runrig

3
$wordline = join(" ", grep(/^\w+$/, split(/\s+/, $wordline))); 
+0

C'est ce que je ferais. Notez, cependant, que \ w inclut le trait de soulignement, _, aussi. Si vous ne le souhaitez pas, spécifiez simplement votre propre classe de caractères. –

+0

OP dit aussi ci-dessous qu'il ne veut pas de chiffres, donc cela vous laisse avec/^ [A-Za-z] + $/(ou équivalent Unicode). –

+0

une autre mise en garde: en fonction de la division des jetons, Brian G pourrait vouloir conserver les caractères de division tels qu'ils sont. Votre solution change tous les séparateurs de jetons en . – user55400

2
s/(?<!\S)(?![A-Za-z]+(?:\s|$))\S+(?!\S)//g 

Dans regex-terre, un "caractère de mot" est une lettre, un chiffre ou un trait de soulignement ([A-Za-z0-9_]). Il semble que vous l'utilisiez pour ne signifier que des lettres, donc \w et \W ne vous fera aucun bien. Mon expression régulière:

  • un tas de caractères non-blancs: \S+

  • non précédé: (?<!\S) ou suivi: (?!\S) par des caractères non-blancs

  • à moins que tous les caractères sont des lettres: (?![A-Za-z]+(?:\s|$))

Cela laissera derrière tous les sp aces entourant les mots qu'il supprime. Traiter avec ceux-ci correctement est un peu plus délicat que vous pourriez vous attendre; c'est beaucoup plus facile à faire dans une étape séparée, par exemple:

s/^ +| +(?= |$)//g 
+0

[A-Za-z] ne traite pas avec Unicode, vous souhaiterez probablement utiliser [[: alpha:]] à la place. –

+0

Je revendique la licence d'enseignant. :) Avec [A-Za-z], il est parfaitement clair ce que vous faites correspondre (et ce que vous n'êtes pas). BTW, [[: alpha:]] ne gère pas non plus Unicode; c'est POSIX-parler pour "les choses classées comme des lettres dans les paramètres régionaux de la plate-forme sous-jacente." –

Questions connexes