Как я могу захватить все записи указанного c слова, но не являясь частью других известных слов? - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь сопоставить и заменить в одном go все совпадения указанного c имени в тексте (несколько предложений), но проблема в том, что это имя может быть частью другого имени. Пример: мне нужно заменить имя «Item 1», но в предложении я могу также указать «Item 11» или «My Item 1» или «Item 1 Test», которые являются известными именами и к которым не следует прикасаться. Список известных неприкасаемых имен строится динамически.

Технически я хочу, чтобы express 'соответствовал всему элементу 1, но если он не является частью [Элемент 11 | Мой предмет 1 | Тест по пункту 1 '' 1003 *

Пример предложения: из-за повышения по пункту 1 оставлен только элемент 11, и я хотел бы заменить элемент 1 на что-то ожидаемое: ожидаемый результат: из-за повышения по рейтингу остался только элемент 11 на что-то. Можно ли достичь с помощью RegEx?

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

С помощью PCRE вы можете полагаться на метод SKIP-FAIL:

(?:Untouchable1|Untouchable2|Untouchable3|other words to keep)(*SKIP)(*F)|other|words|to|match-and-replace

Поскольку вы используете. NET, а именно C#, и имеете код доступа, вы можете использовать шаблон, где вы фиксируете слова, которые нужно заменить, и просто сопоставляете слова, которые нужно сохранить, а затем используете оценщик совпадений для проверки значения группы 1: если совпадение группы 1 выполнено успешно, замените, в противном случае сохраните матч.

var pattern = @"Untouchable1|Untouchable2|Untouchable3|other words to keep|(other|words|to|match-and-replace)";
var result = Regex.Replace(testString, pattern, m => 
    m.Groups[1].Success ? replaceWith : m.Value);
0 голосов
/ 06 февраля 2020

Для вашего конкретного сценария c вы можете использовать:

(?<!My )\bItem 1\b(?! Test)

https://regex101.com/r/iBC6Bf/1/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...