Как я могу инвертировать результаты совпадения моего регулярного выражения?

Вопрос или проблема

Я проверил много информации о том, как я могу инвертировать свое соответствие. Но, к сожалению, я не смог сделать это для своей проблемы. Итак, скажем, у меня есть этот текст:

GS Sos_519 082_KO_Ge124222sshelden892 345

Моя цель – сопоставить все, что не является XYZ XYZ (только числа). Я хотел бы, чтобы мои результаты были следующие:

519 082892 345

Сейчас мне удалось сделать обратное, используя этот регекс:

\d\d\d\s\d\d\d

Он точно соответствует 519 082892 345, и теперь мне нужно инвертировать его.

Я хочу, чтобы логика соответствовала тому, что я хочу в качестве результатов, а затем инвертировалась. Я думал, что так будет проще, но я могу ошибаться.

Сопоставление всего, что не в этом конкретном формате, выглядит действительно сложно.

Я пытался инвертировать это, используя регекс, как этот:

^(?:[\d\d\d\s\d\d\d].)*$

Но, к сожалению, он ничего не сопоставляет.

Стратегия здесь заключается в том, чтобы попытаться сопоставить 3 цифры пробелы 3 цифры (т.е. \d{3}\h+\d{3}) и не обращать на них внимания (т.е. не удалять), или сопоставить любой символ и удалить его.

Проверки (?<!\d) и (?!\d) используются для того, чтобы гарантировать, что мы не сопоставляем 4-значные числа.

  • Ctrl+H
  • Найти что: (?<!\d)\d{3}\h+\d{3}(?!\d)(*SKIP)(*FAIL)|.
  • Заменить на: ОСТАВИТЬ ПУСТЫМ
  • ПРОВЕРИТЬ Оборачивать
  • ПРОВЕРИТЬ Регулярное выражение
  • УБРАТЬ ГАЛОЧКУ . соответствует новой строке
  • Заменить все

Объяснение:

(?<!\d)     # отрицательный просмотр назад, убедившись, что перед нами нет цифры
\d{3}       # 3 цифры
\h+         # 1 или более горизонтальных пробелов
\d{3}       # 3 цифры
(?!\d)      # отрицательный просмотр вперёд, убедившись, что после нас нет цифры
(*SKIP)     # пропустить это соответствие
(*FAIL)     # заставить соответствие провалиться
  |         # ИЛИ
.           # любой символ, кроме новой строки

Скриншот (до):

введите описание изображения здесь

Скриншот (после):

введите описание изображения здесь

Чтобы решить эту задачу, я бы использовал общий подход выбора всего текста между экземплярами вашего соответствия в форме:

(?:^|(?<=match)).+?(?:$|(?=match))

Просто подставьте свой регекс вместо “match”.

Так что для вашего примера:

(?:^|(?<=\d\d\d\s\d\d\d)).+?(?:$|(?=\d\d\d\s\d\d\d))

Чтобы объяснить:

  • первые скобки гарантируют, что вы находитесь в начале (^) ИЛИ соответствие слева (?<=match). “|” означает ИЛИ.
  • затем средняя часть (.+?) соответствует как минимум одному символу или более, но не жадно (?). Это значит, что он не попытается захватить один из ваших совпадений, чтобы найти другое.
  • затем соответствие заканчивается в конце строки ($) ИЛИ когда ваше соответствие в данный момент справа (?=match).

Цель состоит в том, чтобы сохранить все числа (\d) и пробелы ( ), затем
Найти: [^\d ]+|^ | $
Заменить: ПУСТО

Логика RegEx объясняется здесь.

Ответ или решение

Чтобы инвертировать результаты совпадения регулярного выражения, вы можете воспользоваться несколькими методами, в зависимости от конкретной задачи и предпочтений в работе с текстом. В вашем случае необходимо сохранить все элементы в строке, кроме тех, что соответствуют формату "3 цифры + пробел + 3 цифры". Ниже описаны детальные шаги и подходы для решения вашей задачи.

Подход 1: Использование "Negative Lookahead"

Одним из самых эффективных способов инверсии совпадений является использование "negative lookahead", который позволяет игнорировать определенные шаблоны.

  1. Шаблон для поиска: Используйте регулярное выражение, которое найдет три цифры, пробел и снова три цифры:

    \d{3}\s\d{3}
  2. Инверсия совпадений: Чтобы инвертировать, вам нужно будет использовать .*?(?=\d{3}\s\d{3}), которое будет захватывать все символы, пока не встречается ваше выражение, и | для выбора всех остальных символов:

    (?!\d{3}\s\d{3}).*? 

Однако это может не совсем привести к идеальному результату. Вместо этого рассмотрим другой более конкретный подход.

Подход 2: Удаление нежелательных совпадений

Если ваша цель — удалить определенные совпадения из текста, можно использовать простой способ для удаления нежелательных совпадений:

  1. Поиск и замена:

    • Найти:

      \d{3}\s\d{3}
    • Заменить на пустую строку: это удалит совпадения, оставив остальной текст нетронутым.

Подход 3: Сбор всех оставшихся элементов с помощью захватывающих групп

Вы можете использовать следующий подход, чтобы "собрать" все, что не совпадает с вашим шаблоном:

  1. Шаблон для нахождения:

    (?:(?<!\d)\d{3}\s\d{3}(?!\d)|[^ ]+)
  2. Применение шаблона: Вы можете зафиксировать захватывающие группы, которые не содержат совпадений (первую часть), и захватить весь остальной текст.

Пример Кода

Если вы работаете с языком программирования, например Python, это может выглядеть так:

import re

text = "GS Sos_519 082_KO_Ge124222sshelden892 345"
pattern = r'\d{3}\s\d{3}'  # Шаблон для поиска

# Удаление совпадений
result = re.sub(pattern, '', text)

# Удаление лишних пробелов
result = re.sub(r'\s+', ' ', result).strip()  # Удалить лишние пробелы
print(result)  # Вывод: "GS Sos_ _KO_Ge124222sshelden892 345"

Заключение

Ваша задача инверсии совпадений в регулярных выражениях может быть решена разными путями. Используя "negative lookahead", удаляя совпадения или собирая оставшиеся элементы с помощью захватывающих групп, вы можете добиться желаемого результата, сохраняя при этом всю необходимую информацию в тексте. Обязательно протестируйте свой итоговый шаблон в различных сценариях и с учетом возможных дополнительных условий.

Оцените материал
Добавить комментарий

Капча загружается...