2009-03-10 10 views
5

Ich möchte einen regulären Ausdruck für C#, der "Johnson", "Del Sol" oder "Del La Range" entspricht; mit anderen Worten, es sollten Wörter mit Leerzeichen in der Mitte übereinstimmen, aber kein Leerzeichen am Anfang oder am Ende.Regulärer Ausdruck in C# für Nachname, der internen Speicherplatz enthält

+1

Wie sieht die Eingabezeichenfolge aus? Ist der Nachname der einzige Teil der Zeichenfolge, oder ist es ein Satz oder möglicherweise ein vollständiger Name mit optional mehr Leerzeichen? Ich denke, Kontext ist hier wichtig. – Rich

Antwort

0

Die? Qualifier ist dein Freund. Macht eine kürzest mögliche Übereinstimmung statt einer gierigen. Verwenden Sie es für die Vornamen, wie in:

^(.+?) (.+)$ 

Gruppe 1 Zupacken alles bis zum ersten Platz, Gruppe 2, den Rest bekommt.

Natürlich, was machen Sie, wenn der erste Name Leerzeichen enthält?

+0

Schön und einfach, aber ich denke, es wird auch "238 39592" passen, was keine Worte sind. –

+0

dann ersetzen "." mit "\ w" oder "[a-zA-Z]" – Rich

+0

Nicht sicher, ob das OP den Nachnamen selbst oder in einer Zeichenfolge, die sowohl den Vor- als auch den Nachnamen enthält, abgleichen möchte ... Ich nahm den ersteren währenddessen an scheinen das letztere getan zu haben. Dennoch scheint es, dass Ihre Regex Leerzeichen am Anfang oder Ende erlaubt, die behoben werden müssen. – Noldorin

0

Probieren Sie etwas wie folgt aus:

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

Ich glaube nicht, dass Nachnamen Namen enthalten können ... –

3

Das die Arbeit machen sollte:

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

Edit: Hier ist eine leichte Verbesserung, die ein letzteren Namen und Bindestriche/Apostroph im Namen erlaubt :

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

Malcolm X wäre nicht glücklich darüber ... (erfordert mindestens 2 Buchstaben Nachnamen, die ... ist) –

+0

Der kürzeste REAL Name, den ich mir vorstellen kann ist "Ng." Sollte gut sein. ;) –

+0

Eine von Null verschiedene Anzahl von Leuten hat den "echten" Nachnamen von "U" ... –

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

Diese Regex hat folgende Eigenschaften:

  • Will einen Nachnamen einen Buchstaben entsprechen (z Malcolm X Nachname)
  • Wird nicht zuletzt Namen entsprechen die Zahlen enthalten (wie alles mit einem \w oder ein [^ ] wird)
  • Spiele Unicode Buchstaben

Aber was Nachnamen wie „O'Connor“ oder Nachnamen Bindestrich ... hmm ...

-1

ich denke, das mehr ist, was Sie suchen:

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

diese shou ld passt den Anfang der Zeile ohne Leerzeichen, Buchstaben oder Leerzeichen und ohne Leerzeichen am Ende an.

Dies funktioniert in irb, aber letztes Mal, dass ich mit C# gearbeitet, habe ich ähnliche reguläre Ausdrücke verwendet:

(null ist gut, nil Mittel versagt)

>> "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

Die Verwendung der [^] stimmt mit Nachnamen überein, die mit Zahlen, Interpunktion usw. beginnen oder enden ... –

+0

Danny hat Recht. Ich reagierte mit der gleichen Lösung und zog sie zurück, als ich das erkannte. –

3

Im Namen „Salah ad -Dīn Yūsuf ibn Ayyūb "(siehe http://en.wikipedia.org/wiki/Saladdin), welches ist der Vorname und welches ist das letzte? Was ist mit dem Namen "Roberto Garcia y Vega" (erfunden)? "Chiang Kai-shek" (siehe http://en.wikipedia.org/wiki/Chang_Kai-shek)?

Leerzeichen in Namen sind die kleinsten Ihrer Probleme! Siehe Personal names in a global application: What to store.

+0

Ich stimme zu. Egal, wie sehr Sie es versuchen, Sie werden immer Namen finden, die nicht richtig zusammenpassen. Ich meine, wenn Sie nicht die vollständige Kontrolle darüber haben, welche Namen Sie analysieren. –

0

Hier ist eine bessere:

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

Standard Interpunktion Erlaubt und Räume, kann aber nicht mit Interpunktion beginnen.