2015-07-06 2 views
1

Мы имеем необходимость преобразовать полное имя в сокращенном имя, где комбинация входных данных, изменяется следующим образом:REGEX «Полное имя», чтобы «Сокращенное фирменное наименование»

ВХОДА: [опционально название] [личное имя или начальная] [фамилия]

ВЫВОД: [необязательный заголовок] [начальная] [фамилия]

  • г-н Эндрю Смит
  • мистер смит
  • Смита
  • Эндрю Смит

Во всех случаях, как показано выше, выходной сигнал будет г-Смита (где название присутствует) или Смита (где его нет), и я понял что это было бы лучше всего достигнуто с помощью RegEx, хотя я не знаю, какой синтаксис должен был бы сделать это правильно.

Я пробовал несколько человек и только получил смешанные (неправильные) результаты.

В примечании; имена «могут» содержать специальные символы, и никто не имеет среднего имени; таким образом, мы могли бы кто-то назвал г-н Джеймс Рейли-Бонд в списке, который приведет к Mr J O'Reilly-Бонд

Это программируется в C#

+1

Этот вопрос плохо поставлен, не хватает примеров, не описывает конфликтующие случаи, не публикует код или не указывает язык. – Squidly

+0

Это написано на C#, а число примеров списка имен - это в значительной степени полная проблема. – Sean

+0

Вы не можете различать имена и названия, например.Duke – Squidly

ответ

2

Хотя не использовать регулярное выражение, конечно, вариант, я понимаю, что не хочу составлять список возможных названий. Если у вас всегда 2 названия или 3 с заголовком, вы можете сделать все правильно с (([A-Z])\S*)(?=\s\S*$), как видно https://regex101.com/r/tR7kV2/1.

Идея состоит в том, что вы выбираете второе слово для последнего слова, слово находится в группе захвата $ 1, его заглавная буква - в группе захвата $ 2, вы заменяете свой матч на $ 2.

1

Не используйте регулярное выражение. Гораздо проще разбить строку на пробелы, а затем рассуждать на каждом компоненте независимо (если первым является Mr/Mrs/Ms, не обращайте на него внимания, в противном случае возьмите первую букву).

+0

Я рассмотрел что-то подобное этому (извлечение только по первому элементу, имеет довольно много комбинаций для таких: Mr, Mrs, Miss, Dr и т. Д. И посмотрел на расщепление до уровня, который, если split() .length = 3, мы знаем, что у нас есть заголовок, если это 2, то это просто имя/фамилия. Понятно, что использование RegEx будет быстрее (обработка длинного списка) и еще немного более аккуратная. – Sean

+0

Регулярные выражения обычно * медленнее * чем простая обработка строк. Они не являются магии.;) –

+0

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

0

вы можете добиться этого с помощью регулярных выражений Demo:

((?:mr|ms))?(.).* (.*) 

с флагом i для случая нечувствительными и использовать три группы замещения (вы не сказали, какой язык вы используете, так что я могу» t привести пример)

Первая группа соответствует окончательному названию, а затем пробелу и захвату. Вторая группа соответствует первой букве первого слова, а третья группа фиксирует последнее слово (фамилия). Существует совпадение символов между второй и третьей группами в соответствии с форматом имени.

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