Вопрос или проблема
У меня есть следующий регулярное выражение:
(6[6,7][0,1,9][0-9][0-9]{4})
Итак, когда я использую следующие номера в документе, например:
66037717
оно захватывает строку чисел, как и должно, но делает это немного слишком хорошо. Оно захватывает строку в местах, где я не хочу, чтобы это происходило, например, захватывая строку в таких вещах, как URL или cid:image, или поймав эту строку чисел внутри другой строки чисел или букв, что я не хочу.
Поэтому, чтобы исправить это, я добавил следующее к регулярному выражению:
([\b|\s|\p{Pd}|_|\*|\/|\+|\=|.+\n|\t|\r]6[6,7][0,1,9][0-9][0-9]{4})
Я не хотел использовать какие-либо универсальные захваты перед строкой, поэтому я добавил конкретные, о которых я беспокоюсь.
Теперь оно лучше игнорирует такие вещи, как URL и ссылки cid:image, и находит строку практически в любом месте документа, кроме самого начала документа.
Если строка является первым словом в документе без табуляции или пробелов, регулярное выражение не захватывает её.
Так что же я могу сделать, чтобы оно захватывало строку в любом месте документа, но также игнорировало такие вещи, как cid:image и URL и другие случаи? Я уже пробовал ^
и $
, но без успеха.
Это пример документа. Не должно быть никаких пробелов или табуляций, первая цифра начинается с первой строки документа.
66037717
Номер (Опционально) ___________________ Другой номер _____________________________________________ _______________________________ Больше вещей, взятых ____________________________________ Testhouse PO BOX 00000 Jumanji, VV 0000 (800) 555-660377178 Страница 2 из 8 5555 / (Обновлено 01/2025
Приветствия, Что-то об письме. Спасибо [cid:[email protected]] P. 800.660.37717, доб. 5555 Ф. 555.555.5555
66037717_______________________, Альтернативный номер ____________________________ ЧАСТЬ 5. Куча вещей здесь Я назначаю ещё много вещей, эти вещи и эта сумма должны быть выплачены
htttps://aa-browse.proxypage.net/bp/proxy?ep=504749364932660377174974666a4572497a4d
htttps://aa-browse.proxypage.net/bp/proxy?ep=5047493649324974666a4566037717
Ответ или решение
Проблема регулярных выражений: Не захватывается строка в начале документа
Регулярные выражения (regex) играют ключевую роль в обработке текстовой информации, однако они могут представлять собой сложную задачу, особенно когда необходимо учитывать контекст. В вашем случае вы сталкиваетесь с проблемой, где регулярное выражение не захватывает строку в начале документа, что вызывает недоумение и необходимость поиска решения.
Исходные Условия
Ваше текущее регулярное выражение выглядит следующим образом:
(6[6,7][0,1,9][0-9][0-9]{4})
Это выражение корректно захватывает строки, имеющие формат 660xxxx
или 670xxxx
и так далее, но, как вы заметили, оно также захватывает нежелательные строки, такие как URL или другие форматы, которые вы не хотите включать.
Вы модифицировали выражение следующим образом:
([\b|\s|\p{Pd}|_|\*|\/|\+|\=|.+\n|\t|\r]6[6,7][0,1,9][0-9][0-9]{4})
Однако это повлияло на его способность захватывать номер в начале документа.
Проблема с Захватом
Ваша проблема заключается в том, что используемые вами метасимволы (например, \b
для границ слова) и другие символы могут не работать должным образом в контексте, где строка начинается с нужных цифр. Также использование |
для обозначения альтернатив может вызвать неожиданные результаты.
Решение
Чтобы ваше регулярное выражение корректно захватывало строку в любом контексте, включая начало документа, вам потребуется изменить его. Попробуйте следующее:
(?<!\d)(6[6,7][0,1,9][0-9][0-9]{4})(?!\d)
Объяснение решения:
-
(?<!\d)
– Это негативный просмотр назад. Он проверяет, что перед искомым номером отсутствуют цифры. Это предотвращает захват номерных последовательностей, находящихся внутри других строк, таких как URL. -
(6[6,7][0,1,9][0-9][0-9]{4})
– Основная часть вашего выражения, захватывающая нужный формат номера. -
(?!\d)
– Это негативный просмотр вперед, который проверяет, что после нужного номера также не следуют цифры. Это дополнительно гарантирует, что вы не захватываете номера внутри других строк.
Применение
Данное регулярное выражение должно корректно работать в вашем случае, позволяя находить номер в любом месте документа, включая его начало, и игнорируя нежелательные вхождения в форму URL или другие строки.
Заключение
Использование регулярных выражений требует точности и внимания к деталям. Неправильный подход или использование множества лишних символов может привести к неожиданным результатам. Следуя предложенному решению, вы сможете эффективно захватывать нужные номера, сохраняя при этом необходимый контекст. Убедитесь, что тестируете новое выражение на различных примерах, чтобы быть уверенным в его универсальности.