2009-03-10 8 views
5

Mi piacerebbe un'espressione regolare per C# che corrisponda a "Johnson", "Del Sol" o "Del La Range"; in altre parole, dovrebbe corrispondere a parole con spazi nel mezzo ma senza spazio all'inizio o alla fine.Espressione regolare in C# per Cognome che include lo spazio interno

+1

Che aspetto ha la stringa di input? Il cognome è l'unica parte della stringa, o è una frase, o forse un nome completo con facoltativamente più spazi? Penso che il contesto sia importante qui. – Rich

risposta

0

Il? qualificatore è tuo amico. Fa una partita più breve possibile invece di una golosa. Usalo per il primo nome, come in:

^(.+?) (.+)$ 

Gruppo 1 afferra tutto fino al primo spazio, il gruppo 2 ottiene il resto.

Ovviamente, ora cosa si fa se il primo nome contiene spazi?

+0

Bello e semplice, ma penso che corrisponderà anche a "238 39592", che non sono parole. –

+0

quindi sostituire "." con "\ w" o "[a-zA-Z]" – Rich

+0

Non sono sicuro se l'OP vuole far corrispondere il cognome da solo o all'interno di una stringa contenente sia il nome che il cognome ... Ho supposto il primo, mentre tu sembra aver fatto il secondo. Tuttavia, sembra che la tua regex consenta spazi all'inizio o alla fine, che devono essere corretti. – Noldorin

0

provare qualcosa di simile:

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

Non credo che i cognomi possano contenere numeri ... –

3

Questo dovrebbe fare il lavoro:

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

Edit: Ecco un leggero miglioramento che permette con un solo quest'ultimo nomi e trattini/apostrofi nel nome :

+0

Malcolm X non sarebbe felice di questo ... (richiede un minimo di 2 cognomi come ...) –

+0

Il nome REAL più breve che riesco a pensare è "Ng." Dovrebbe andare bene. ;) –

+0

Un numero non-zero di persone ha il "vero" cognome di "U" ... –

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

Questa espressione regolare ha le seguenti caratteristiche:

  • corrisponderà una sola lettera cognome (per esempio il cognome di Malcolm X)
  • non corrisponderà ultimi nomi che contengono numeri (come qualsiasi cosa con un \w o un [^ ] volontà)
  • Partite lettere unicode

Ma che dire di ultimi nomi come "O'Connor" o sillabato cognome ... hmm ...

-1

credo che questo sia più quello che stavate cercando:

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

questo shou ld corrisponde all'inizio della linea senza spazio, caratteri alfa o uno spazio e nessuno spazio alla fine.

Questo funziona in IRB, ma l'ultima volta ho lavorato con C#, ho usato le regex simili:

(zero è buona, mezzi nil fallito)

>> "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'uso di [^] corrisponderà ai cognomi che iniziano o terminano con numeri, punteggiatura, ecc ... –

+0

Danny ha ragione. Ho risposto con la stessa soluzione e l'ho ritratta quando me ne sono reso conto. –

3

In nome "ad Salah -Dīn Yūsuf ibn Ayyūb "(vedi http://en.wikipedia.org/wiki/Saladdin), che è il primo nome e quale è l'ultimo? Che dire nel nome "Roberto Garcia y Vega" (inventato)? "Chiang Kai-shek" (vedi)?

Gli spazi nei nomi sono l'ultimo dei tuoi problemi! Vedi Personal names in a global application: What to store.

+0

Sono d'accordo. Non importa quanto duramente ci provi troverai sempre nomi che non corrispondono correttamente. Voglio dire, se non hai il controllo completo su quali nomi stai analizzando. –

0

Ecco uno migliore:

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

Consente punteggiatura standard e gli spazi, ma non può iniziare con la punteggiatura.