2009-03-10 4 views
5

Я хотел бы Регулярное выражение для C#, которое соответствует «Johnson», «Del Sol» или «Del La Range»; другими словами, он должен соответствовать словам с пробелами в середине, но без пробела в начале или в конце.Регулярное выражение в C# для фамилии, которое включает внутреннее пространство

+1

Как выглядит строка ввода? Является ли последнее имя единственной частью строки, или это предложение или, возможно, полное имя с необязательным количеством пробелов? Я думаю, что здесь здесь важно. – Rich

ответ

0

The? квалификатор - ваш друг. Делает кратчайший возможный матч вместо жадного. Используйте его для первого имени, как в:

^(.+?) (.+)$ 

Группа 1 захватывает все до первого места, группа 2 получает все остальное.

Конечно, теперь что вы будете делать, если first имя содержит пробелы?

+0

Приятный и простой, но я думаю, что он будет соответствовать «238 39592», а это не слова. –

+0

затем замените "." с «\ w» или «[a-zA-Z]» – Rich

+0

Не уверен, что OP хочет совместить фамилию самостоятельно или внутри строки, содержащей как имя, так и фамилию ... Я предполагал, что первое, а вы похоже, сделали последнее. Тем не менее, кажется, что ваше регулярное выражение позволяет пробелы в начале или в конце, которые необходимо исправить. – Noldorin

0

Попробуйте что-то вроде этого:

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

Я не думаю, что фамилии могут содержать цифры ... –

3

Это должно сделать работу:

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

Edit: Вот небольшое усовершенствование, которое позволяет один-ПОСЛЕДНИХ имена и дефис/апостроф в имени :

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

Malcolm X не был бы рад этому ... (требуется минимум 2 буквы, которые есть ...) –

+0

Самое короткое РЕАЛЬНОЕ имя, о котором я могу думать, это "Ng." Все должно быть в порядке. ;) –

+0

Ненулевое число людей имеет «настоящую» фамилию «U» ... –

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

Это регулярное выражение имеет следующие особенности:

  • будет соответствовать фамилии одну букву (например, фамилия Малкольма Х)
  • не будет соответствовать фамилии, содержащие числа (например, что-нибудь с \w или [^ ] будет)
  • Матчей Юникода буквы

Но что о фамилиях, как «Коннор» или дефис фамилии ... хмм ...

-1

Я думаю, что это больше, чем вы искали:

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

Это ШОУ ld соответствует началу строки без пробела, альфа-символов или пробела, а в конце нет места.

Это работает в IRB, но последний раз, когда я работал с C#, я использовал подобные регулярные выражения:

(ноль хорошо, ноль означает не удалось)

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

Использование [^] будет соответствовать именам, начинающимся или заканчивающимся цифрами, пунктуацией и т. Д. –

+0

Дэнни прав. Я ответил тем же самым решением и отступил, когда понял это. –

3

Во имя «Салах ад -Dīn Yūsuf ibn Ayyūb "(см. http://en.wikipedia.org/wiki/Saladdin), который является первым именем и является последним? Как насчет имени «Роберто Гарсия и Вега» (придумано)? «Чан Кай-ши» (см. http://en.wikipedia.org/wiki/Chang_Kai-shek)?

Пространства в именах - это наименее важные проблемы! См. Personal names in a global application: What to store.

+0

Согласен. Независимо от того, насколько сильно вы пытаетесь, вы всегда найдете имена, которые не соответствуют правильно. Я имею в виду, если у вас нет полного контроля над тем, какие имена вы разбираете. –

0

Вот лучше один:

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

Позволяет стандартные знаки препинания и пробелы, но не может начинаться с пунктуацией.

Смежные вопросы