Вопрос или проблема
Я проверил много информации о том, как я могу инвертировать свое соответствие. Но, к сожалению, я не смог сделать это для своей проблемы. Итак, скажем, у меня есть этот текст:
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", который позволяет игнорировать определенные шаблоны.
-
Шаблон для поиска: Используйте регулярное выражение, которое найдет три цифры, пробел и снова три цифры:
\d{3}\s\d{3}
-
Инверсия совпадений: Чтобы инвертировать, вам нужно будет использовать
.*?(?=\d{3}\s\d{3})
, которое будет захватывать все символы, пока не встречается ваше выражение, и|
для выбора всех остальных символов:(?!\d{3}\s\d{3}).*?
Однако это может не совсем привести к идеальному результату. Вместо этого рассмотрим другой более конкретный подход.
Подход 2: Удаление нежелательных совпадений
Если ваша цель — удалить определенные совпадения из текста, можно использовать простой способ для удаления нежелательных совпадений:
-
Поиск и замена:
-
Найти:
\d{3}\s\d{3}
-
Заменить на пустую строку: это удалит совпадения, оставив остальной текст нетронутым.
-
Подход 3: Сбор всех оставшихся элементов с помощью захватывающих групп
Вы можете использовать следующий подход, чтобы "собрать" все, что не совпадает с вашим шаблоном:
-
Шаблон для нахождения:
(?:(?<!\d)\d{3}\s\d{3}(?!\d)|[^ ]+)
-
Применение шаблона: Вы можете зафиксировать захватывающие группы, которые не содержат совпадений (первую часть), и захватить весь остальной текст.
Пример Кода
Если вы работаете с языком программирования, например 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", удаляя совпадения или собирая оставшиеся элементы с помощью захватывающих групп, вы можете добиться желаемого результата, сохраняя при этом всю необходимую информацию в тексте. Обязательно протестируйте свой итоговый шаблон в различных сценариях и с учетом возможных дополнительных условий.