2009-03-10 8 views
5

Je voudrais une expression régulière pour C# qui corresponde à "Johnson", "Del Sol" ou "Del La Range"; en d'autres termes, il doit correspondre à des mots avec des espaces au milieu mais pas d'espace au début ou à la fin.Expression régulière en C# pour le nom de famille incluant l'espace interne

+1

À quoi ressemble la chaîne d'entrée? Est-ce que le nom de famille est la seule partie de la chaîne, ou est-ce une phrase, ou éventuellement un nom complet avec éventuellement plus d'espaces? Je pense que le contexte est important ici. – Rich

Répondre

0

Le? qualificateur est votre ami. Fait un match le plus court possible au lieu d'un match gourmand. Utilisez-le pour le premier nom, comme dans:

^(.+?) (.+)$ 

Groupe 1 saisit tout au premier espace, le groupe 2 le reste.

Bien sûr, maintenant que faites-vous si le premier nom contient des espaces?

+0

Nice et simple, mais je pense qu'il va correspondre "238 39592" ainsi, qui ne sont pas des mots. –

+0

puis remplacer "." avec "\ w" ou "[a-zA-Z]" – Rich

+0

Vous ne savez pas si l'OP veut faire correspondre le nom de famille par lui-même ou dans une chaîne contenant à la fois le prénom et le nom de famille ... semblent avoir fait le dernier. Pourtant, il semble que votre regex autorise des espaces au début ou à la fin, ce qui doit être corrigé. – Noldorin

0

Essayez quelque chose comme ceci:

^[^\s][\w\s]*[^\s]$ 
+0

Je ne pense pas que les noms de famille peuvent contenir des nombres ... –

3

Cela devrait faire le travail:

^[a-zA-Z][a-zA-Z ]*[a-zA-Z]$ 

Edit: Voici une légère amélioration qui permet des noms d'un dernier et traits d'union/apostrophes au nom :

^[a-zA-Z'][a-zA-Z'- ]*[a-zA-Z']?$ 
+0

Malcolm X ne serait pas content à propos de ça ... (il faut un minimum de 2 lettres, c'est-à-dire ...) –

+0

Le nom REEL le plus court auquel je puisse penser est "Ng" Ça devrait aller. ;) –

+0

Un nombre non nul de personnes ont le "vrai" nom de famille "U" ... –

5
^\p{L}+(\s+\p{L}+)*$ 

Cette regex présente les caractéristiques suivantes:

  • correspondra à une lettre nom de famille (par exemple nom de Malcolm X)
  • ne correspond pas à des noms contenant des nombres derniers (comme quoi que ce soit avec un \w ou [^ ] sera)
  • correspondances lettres unicode

Mais qu'en est-noms de famille comme « O'Connor » ou noms de famille ... césure hmm ...

-1

Je pense que cela est plus ce que vous recherchez:

^[^ ][a-zA-Z ]+[^ ]$ 

cette shou ld correspond au début de la ligne sans espace, caractères alpha ou espace, et pas d'espace à la fin.

Cela fonctionne dans RIR, mais la dernière fois que je travaillais avec C#, je l'ai utilisé regexes similaires:

(zéro est bon, moyen nul a échoué)

>> "Di Giorno" =~ /^[^ ][a-zA-Z ]+[^ ]$/ 
=> 0 
>> "DiGiorno" =~ /^[^ ][a-zA-Z ]+[^ ]$/ 
=> 0 
>> " DiGiorno" =~ /^[^ ][a-zA-Z ]+[^ ]$/ 
=> nil 
>> "DiGiorno " =~ /^[^ ][a-zA-Z ]+[^ ]$/ 
=> nil 
>> "Di Gior no" =~ /^[^ ][a-zA-Z ]+[^ ]$/ 
=> 0 
+1

L'utilisation de [^] fera correspondre les noms commençant ou se terminant par des chiffres, des signes de ponctuation, etc ... –

+0

Danny a raison. J'ai répondu avec la même solution et je me suis rétracté quand j'ai réalisé cela. –

3

Au nom « ad Ṣalāḥ -Dīn Yūsuf ibn Ayyūb "(voir http://en.wikipedia.org/wiki/Saladdin), qui est le premier nom, et qui est le dernier? Qu'en est-il du nom "Roberto Garcia y Vega" (inventé)? "Chiang Kai-shek" (voir http://en.wikipedia.org/wiki/Chang_Kai-shek)?

Les espaces dans les noms sont le moindre de vos problèmes! Voir Personal names in a global application: What to store.

+0

Je suis d'accord. Peu importe comment vous essayez, vous trouverez toujours des noms qui ne correspondent pas correctement. Je veux dire, si vous n'avez pas un contrôle complet sur les noms que vous analysez. –

0

est ici un meilleur:

/^[a-zA-Z]+(([\'\,\.\- ][a-zA-Z ])?[a-zA-Z]*)*$/ 

Permet la ponctuation standard et des espaces, mais ne peut pas commencer avec la ponctuation.

Questions connexes