Сравнение двух списков в Excel с VBA Regex

Я хочу использовать их для сравнения двух списков (столбцов) в 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» с предшествующим пробелом.

6
задан Ram 19 June 2015 в 14:57
поделиться