2009-01-15 4 views
3

J'ai un tas de prénoms dans un champ qui portent une initiale avec un '.' à la fin ..

je besoin d'un regex pour convertir cet exemple:

Kenneth R.

en

Kenneth

J'ai essayé de construire mon propre et a trouvé ce site utile btw ..

http://www.gskinner.com/RegExr/

mais Je suis nouveau à Perl & expressions régulières et ne pouvait obtenir "... $" - ce qui est inutile quand il n'y a pas d'initiale du milieu à la fin du prénom .... Comment puis-je supprimer l'initiale du milieu avec un point à la fin?


je viens de trouver un autre format de nom qui a besoin de considération ... 'R. Kelly » doit être « Kelly »

Répondre

3

Pour supprimer le dernier « mot » si elle se termine par point:

my $name =~ s/\w+\.$//i; 

(cela vous suppose ne disposez pas d'espace après)

Pour supprimer tout mot se terminant avec un point:

my $name =~ s/\w+\.//i; 

regard sur le modificateur/g si vous voulez les supprimer tous ...

et BTW vous faire une liste de cas de test pour vérifier votre solution essayez avec des données réelles de mot, vous aurez probablement quelques surprises ...

+0

cela fonctionne ... merci beaucoup ... voir mon édition sur R. Kelly aussi. J'ai quelques noms dans le db qui ont ce format aussi – CheeseConQueso

+0

hahah nm merci, j'ai vu votre réponse originale et rafraîchi et maintenant votre seconde est venu – CheeseConQueso

+0

pouvez-vous me donner une brève description de la façon dont chaque élément fonctionne dans ces derniers? Je veux en savoir plus sur ces derniers et ils sont très non intuitifs même quand vous savez ce qu'ils sont censés faire – CheeseConQueso

2

Pour prendre soin de l'affaire R. Kelly:

s/\w\. *//g 

Voici un test rapide:

$ echo 'R. Kelly 
Kenneth R. 
R. Kemp R. 
John Q. Smith' | perl -pe 's/\w\. *//g' 
Kelly 
Kenneth 
Kemp 
John Smith 

Je suggère que:

  1. L'option globale (g) est requise.
  2. L'option insensible à la casse (i) ne l'est pas.
  3. Vous pouvez envisager de rechercher uniquement les initiales majuscules ([:upper:]).
  4. Les "initiales" de caractères multiples doivent être considérées avec suspicion. (Donc, w+ est probablement une erreur, sauf si vos données ont des cas pertinents.)
  5. Lire perldoc perlre pour plus d'informations.
+0

Mais notez que si une initiale arrive à tomber au milieu du nom, par exemple. "John Q. Smith", votre solution réunira les deux mots environnants, par ex. "John Smith". –

+0

J'ai ajouté un correctif simple qui place des espaces à la fin de la chaîne. Cela pourrait être nettoyé avec: s/* $ // si désiré. –

Questions connexes