Исключить конкретное число из регулярного выражения

Путем регулярного выражения я пытаюсь извлечь из письма html-формата полученный 6-ти значный код. Делаю я это путем \d{6} Это извлекает все числа из письма с 6-ю элементами, но проблема в том, что в коде письма есть повторяющееся несколько раз число "333333". Как я могу извлечь нужный мне код, срезав эти тройки? Пытался с помощью \d{6}[^3333333] и все в таком роде - безрезультатно. С регулярными выражениями до этого не сталкивался.


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Если необходимо найти все 6-значные числа независимо от контекста, и при этом исключить совпадения конкретного 6-значного числа, можно использовать

(?!333333)\d{6}

В данном случае, этот шаблон можно сократить до (?!3{6})\d{6}. См. пример работы выражения. (?!333333) - отрицающий (негативный) блок предварительного просмотра вперёд, который исключает совпадение, если сразу после текущей позиции есть подстрока 333333. 3{6} находит цифру 3 шесть раз подряд.

Если необходимо извлечь числа как целые слова, используйте границы слова, \b:

\b(?!333333\b)\d{6}\b

См. пример работы выражения. Первый \b требует наличия начала строки или буквы/цифры/_ сразу перед совпадением, а второй \b требует наличия конца строки или буквы/цифры/_ сразу после совпадения.

Если необходимо найти только такие числа, с обеих сторон которых могут находиться любые символы, кроме цифр, используйте

(?<!\d)(?!333333(?!\d))\d{6}(?!\d)

См. пример работы выражения. (?<!\d) требует отсутствия цифры сразу перед совпадением, а (?!\d) требует отсутствия цифры сразу после совпадения.

→ Ссылка