Я хочу использовать их для сравнения двух списков (столбцов) в Excel, чтобы найти Спички. Поскольку это довольно сложная операция, я выполнял ее в прошлом, используя несколько различных функций (не VBA) в Excel, но это оказалось в лучшем случае неудобным, и поэтому я хотел попробовать все-в-одном Решение VBA, если возможно.
В первой колонке есть имена с нарушениями (например, прозвища в кавычках, суффиксы, такие как «младший» или «ср», и круглые скобки вокруг «предпочтительных» вариантов имен). Кроме того, когда присутствуют отчества, они могут быть либо именем, либо инициалом.
Порядок в первом столбце:
<first name or initial>
<space>
<any parenthetical 'preferred' names - if they exist>
<space>
<middle name or initial - if it exists>
<space>
<quoted nickname or initial - if it exists>
<space>
<last name>
<comma - if necessary><space - if necessary><suffix - if it exists>
Порядок во втором столбце:
`<lastname><space><suffix>,<firstname><space><middle name, if it exists>`
, без каких-либо «неровностей», которые есть в первом столбце.
Моя основная цель — «очистить» первый столбец в следующем порядке:
`lastname-space-suffix,firstname-space-preferred name-space-
middle name-space-nickname`
Хотя я оставляю здесь «неполадки», я мог бы использовать своего рода «флажки» в коде сравнения, чтобы предупреждать меня о них. в каждом конкретном случае.
Я пробовал несколько шаблонов, и это мой самый последний:
["]?([A-Za-z]?)[.]?["]?[.]?[\s]?[,]?[\s]?
Однако я хотел бы разрешить использование фамилии и суффиксов (если они существуют). Я протестировал его с «глобальным», однако я не мог понять, как разделить фамилию и суффиксы, например, с помощью обратной ссылки.
Затем я хотел бы сравнить последний, первый, средний инициал (поскольку большинство имен являются только инициалами в первом списке) между двумя списками.
An example would be:
(1st list)
John (Johnny) B. "Abe" Smith, Jr.
turned into:
Smith Jr,John (Johnny) B "Abe"
or
Smith Jr,John B
and
(2nd list)
Smith Jr,John Bertrand
turned into:
Smith Jr,John B
Then run a comparison between the two columns.
Что было бы хорошей отправной точкой или точкой для продолжения этого сравнения списков?
Приложение от 10 апреля 2012 г.:
В качестве примечания: мне нужно убрать кавычки из псевдонимов и скобки из предпочтительных имен. Могу ли я просто разбить сгруппированные ссылки на подгруппы (в приведенных ниже примерах)?
(?: ([ ] \( [^)]* \)))? # (2) parenthetical 'preferred' name (optional)
(?: ([ ] (["'] ) .*?) \6 )? # (5,6) quoted nickname or initial (optional)
Могу ли я сгруппировать их следующим образом:
(?:(([ ])(\()([^)]*)(\))))? # (2) parenthetical 'preferred' name (optional)
not sure how to do this one - # (5,6) quoted nickname or initial (optional)
Я попробовал их в «Regex Coach» и «RegExr», и они работали нормально, но в VBA, когда я хотел, чтобы обратные ссылки возвращались, как в \11,\5 все, что было возвращено, - это имя, цифра и запятая (например, «Carl1»). Я вернусь, чтобы проверить на наличие опечаток. Спасибо за любую помощь.
Добавление от 17 апреля 2012 г.:
Я упустил из виду одну «ситуацию» с именем, а именно фамилии, состоящие из 2 или более слов, например «Сен-Сир» или «Фон Вильгельм».
Будет ли работать в этом регулярном выражении следующее дополнение
`((St|Von)[ ])?
, которое вы предложили?
`((St|Von)[ ])?([^\,()"']+)
Мои тесты в Regex Coach и RegExr не совсем сработали, поскольку замена возвращает «St» с предшествующим пробелом.