Добавление / удаление дефисов / тире из списка определенных c слов с помощью REGEX (American vs Briti sh Engli sh) - PullRequest
1 голос
/ 30 мая 2020

Я пытаюсь добавить / удалить дефисы из списка очень специфичных c слов в документе, например:

вышеупомянутое, базовая линия, запуск >> вышеупомянутое, базовое состояние, запуск

Я хотел бы написать для этого ОДНУ строку REGEX, так как задача и шаблон ВСЕГДА одинаковы: добавить / удалить дефис из известной пары слов. Конечно, я могу сделать это, используя отдельную операцию REGEX для каждой пары, но это очень неуклюже и ресурсоемко:

(afore)-(mention) >> $1$2
(base)-(line) >> $1$2
(start)-(up) >> $1$2
etc.

Это кажется гораздо более простым подходом:

(?:(afore)-(mention)|(base)-(line)|(start)-(up))    >> $1$2

Проблема в том, что это дает новую обратную ссылку для каждого совпадения, что бесполезно. Я мог бы составить два списка, но тогда у меня будут странные совпадения, которые мне не нужны, что становится проблемой, если список становится длинным, и могут произойти случайные совпадения (перед строкой >> перед строкой, в базовой версии >> в базовой конфигурации, et c.):

(?:(afore|base|start)-(mentioned|line|up))  >> $1$2

Есть идеи? Заранее спасибо!

1 Ответ

0 голосов
/ 30 мая 2020

Вы можете использовать именованные группы захвата , используя синтаксис (?<s>...) или (?'s'...):

(?<s>afore)-(?<r>mention)|(?<s>base)-(?<r>line)|(?<s>start)-(?<r>up)

Или, чтобы сопоставить только целые слова, добавьте границы слов:

\b(?:(?<s>afore)-(?<r>mention)|(?<s>base)-(?<r>line)|(?<s>start)-(?<r>up))\b

Замените ${s}${r}.

См. Демонстрацию regex .

Любая часть перед дефисом попадет в s именованный захват, а вторая часть будет в группе r. Именованный синтаксис обратной ссылки в. NET regex:

${<strong><em>name</em></strong>}

Снимок экрана демонстрации:

enter image description here

...