Некорректная работа регулярного выражения

  • Автор темы Автор темы serg32
  • Дата начала Дата начала

serg32

Client
Регистрация
27.02.2015
Сообщения
545
Реакции
15
Баллы
18
Здравствуйте.
Не первый раз уже возникает проблема, когда регулярка отрабатывает не совсем верно. Она не целпляет действительно "Самое короткое совпадение". Вот пример, есть текст:

"Ab" aria-label="Изменить картинку профиля" href="https://profiles.com/?hl=ru&amp;tab=mX" target="_blank"><div class="gb_Bb gbip" title="Профиль"></div><span class="gb_lb">Изменить</span></a><div class="gb_zb"><div class="gb_Cb gb_Db">biteamazing Селезнев</div><div class="gb_Eb">biteamazing78ru@gmail.com"

В котором надо выдернуть только адрес почты, естественно что я в конструкторе указываю что перед началом есть - ">, а искомый текст заканчивается на - @gmail.com - в итоге получаю регулярку вида:
"(?<=">).*?@gmail\.com"
Но она отрабатывает неверно, она возвращает весь текст со шлаком, хотя очевидно же что это самое короткое совпадение, почему так происходит? Что я не так делаю?
 
Регулярка отрабатывает корректно. Она находит подходящее условие (в твоём случае двойные кавычки) и от него ищет самое короткое.
Когда регулярка нашла последовательность, подходящую под условие, она н ебудет возвращаться, чтобы подыскать более подходящую
 
Ну ведь по факту это не самое короткое, двойные ковычке это я текст обернул для примера, но даже с ними эффект тот же, не понимаю, почему это является вдруг является самым коротким совпадением, хотя по факту ведь глазами даже понятно что есть короче и 100% совпадение
 
Какой тогда толк от галочки самое короткое совпадение? А можно ли тогда реверсивный поиск регулярки задать? Что бы сначала она нашла текст, который подходио по окончанию, в данном случае это - @gmail\.com и искала в перед до тех пор пока перед текстом не будет - "> и вернуть действительно самый короткий результат, а не такой шмат данных
 
Ну ведь по факту это не самое короткое, двойные ковычке это я текст обернул для примера, но даже с ними эффект тот же, не понимаю, почему это является вдруг является самым коротким совпадением, хотя по факту ведь глазами даже понятно что есть короче и 100% совпадение
это совпадение является самым коротким из той точки, которая начала удовлетворять условиям поиска. Регулярка НИКОГДА не возвращается, если что-то нашла. Если у нас последовательность 123456, регулярка нашла 2345, то она не будет возвращается к 3, чтобы поискать более подходящее совпадение
Самое короткое в её работе подразумевает, что если она найдёт последовательность под условие, она не продолжит шерстить строку, проверяя, а не вольётся ли ещё 1 символ в уже найденную последовательность
 
Какой тогда толк от галочки самое короткое совпадение? А можно ли тогда реверсивный поиск регулярки задать? Что бы сначала она нашла текст, который подходио по окончанию, в данном случае это - @gmail\.com и искала в перед до тех пор пока перед текстом не будет - "> и вернуть действительно самый короткий результат, а не такой шмат данных
толк такой. Есть текст
Код:
Развернуть Свернуть Копировать
<тег>почта1@gmail.com</тег><тег>почта2@gmail.com</тег>
Самое короткое (?<=>).+?@gmail.com
отдаст почта1@gmail.com
Жадное (?<=>).+@gmail.com
отдаст почта1@gmail.com</тег><тег>почта2@gmail.com
 
  • Спасибо
Реакции: serg32
толк такой. Есть текст
так то есть, сам знаю, но как видно по факту не всегда)) я считаю это нелогичным поведением регулярного выражения, так как оно не удовлетворят условию по факту.
 
Так а что насчет реверсивного поиска? Его можно как то задать? Если он мордой ищет неверно? Зачем цепляться так к самому первому вхождению и считать главное что оно уже является самым коротким? Или как то зациклить этот поиск до действительно самого короткого? Как решить то то эту задачу, надо костыль мутить, я пробую обернуть весь текст в свои теги что бы целпяться удобней было, но эффект тот же, регулярка считает что она уже справилась и опять так некорректно
 
Так а что насчет реверсивного поиска? Его можно как то задать? Если он мордой ищет неверно? Зачем цепляться так к самому первому вхождению и считать главное что оно уже является самым коротким? Или как то зациклить этот поиск до действительно самого короткого? Как решить то то эту задачу, надо костыль мутить, я пробую обернуть весь текст в свои теги что бы целпяться удобней было, но эффект тот же, регулярка считает что она уже справилась и опять так некорректно
Во-первых, регулярки не являются зенновской разработкой. Если тебе кажется что-то нелогичным, это значит, что ты просто не до конца понимаешь механику работы.
Во-вторых, костыли не нужны. Просто нужно более правильно составлять условия, допустимые символы и т.д. Хотя, всё же, бывают случаи, когда одной регуляркой не обойтись.
Покажи текст, я покажу регулярку без костылей
 
  • Спасибо
Реакции: serg32
Хотя, всё же, бывают случаи, когда одной
Да, это походу тот самый случай. Текст я же выше написал, он и есть, смысл один, дернуть оттуда почту. Я уже сделал костыль свой. Я просто через поиск-замену порезал все) Сначала удалил все что идет после @gmail.com, а потом удалил все что идет перед тегом >, а все что после него оставил, как раз нашу почту, а уже затем просто удалил сам тег -> в три оборота))),но работает, поэтому я и говорю про костыль
 
  • Спасибо
Реакции: serg32
потому что через конструктор регулярка имеет слишком расплывчатые условия
Жесть....А как тогда лучше составлять регулярки? Есть какой нибудь другой конструктор? Или инфа какая? Потому что такого варианта в конструкторе не собрать получается....
 
  • Спасибо
Реакции: serg32
А как дословно звучит эта регулярка получается [^>] - игнорируй все, включительно сам символ > и все что после него? А эта часть - +@gmail.com, что искомый текст будет включать в себя @gmail.com? Так получается?
 
А как дословно звучит эта регулярка получается [^>] - игнорируй все, включительно сам символ > и все что после него? А эта часть - +@gmail.com, что искомый текст будет включать в себя @gmail.com? Так получается?
[^>] - любой символ, кроме >
[^>]+ - макс. последовательность таких символов
[^>]+@gmail.com - макс. последовательность символов, исключая >, после которой будет @gmail.com

Кстати, чутка ошибся, правильнее будет [^>]+@gmail\.com
 
Жесть....А как тогда лучше составлять регулярки? Есть какой нибудь другой конструктор?
На кой вообще этот изврат с html, когда есть xPath, который намного проще...(facepalm)
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)