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

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">[email protected]"

В котором надо выдернуть только адрес почты, естественно что я в конструкторе указываю что перед началом есть - ">, а искомый текст заканчивается на - @gmail.com - в итоге получаю регулярку вида:
"(?<=">).*?@gmail\.com"
Но она отрабатывает неверно, она возвращает весь текст со шлаком, хотя очевидно же что это самое короткое совпадение, почему так происходит? Что я не так делаю?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Регулярка отрабатывает корректно. Она находит подходящее условие (в твоём случае двойные кавычки) и от него ищет самое короткое.
Когда регулярка нашла последовательность, подходящую под условие, она н ебудет возвращаться, чтобы подыскать более подходящую
 

serg32

Client
Регистрация
27.02.2015
Сообщения
545
Благодарностей
15
Баллы
18
Ну ведь по факту это не самое короткое, двойные ковычке это я текст обернул для примера, но даже с ними эффект тот же, не понимаю, почему это является вдруг является самым коротким совпадением, хотя по факту ведь глазами даже понятно что есть короче и 100% совпадение
 

serg32

Client
Регистрация
27.02.2015
Сообщения
545
Благодарностей
15
Баллы
18
Какой тогда толк от галочки самое короткое совпадение? А можно ли тогда реверсивный поиск регулярки задать? Что бы сначала она нашла текст, который подходио по окончанию, в данном случае это - @gmail\.com и искала в перед до тех пор пока перед текстом не будет - "> и вернуть действительно самый короткий результат, а не такой шмат данных
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Ну ведь по факту это не самое короткое, двойные ковычке это я текст обернул для примера, но даже с ними эффект тот же, не понимаю, почему это является вдруг является самым коротким совпадением, хотя по факту ведь глазами даже понятно что есть короче и 100% совпадение
это совпадение является самым коротким из той точки, которая начала удовлетворять условиям поиска. Регулярка НИКОГДА не возвращается, если что-то нашла. Если у нас последовательность 123456, регулярка нашла 2345, то она не будет возвращается к 3, чтобы поискать более подходящее совпадение
Самое короткое в её работе подразумевает, что если она найдёт последовательность под условие, она не продолжит шерстить строку, проверяя, а не вольётся ли ещё 1 символ в уже найденную последовательность
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Какой тогда толк от галочки самое короткое совпадение? А можно ли тогда реверсивный поиск регулярки задать? Что бы сначала она нашла текст, который подходио по окончанию, в данном случае это - @gmail\.com и искала в перед до тех пор пока перед текстом не будет - "> и вернуть действительно самый короткий результат, а не такой шмат данных
толк такой. Есть текст
Код:
<тег>почта[email protected]</тег><тег>почта[email protected]</тег>
Самое короткое (?<=>)[email protected]
отдаст почта[email protected]
Жадное (?<=>)[email protected]
отдаст почта[email protected]</тег><тег>почта[email protected]
 
  • Спасибо
Реакции: serg32

serg32

Client
Регистрация
27.02.2015
Сообщения
545
Благодарностей
15
Баллы
18
толк такой. Есть текст
так то есть, сам знаю, но как видно по факту не всегда)) я считаю это нелогичным поведением регулярного выражения, так как оно не удовлетворят условию по факту.
 

serg32

Client
Регистрация
27.02.2015
Сообщения
545
Благодарностей
15
Баллы
18
Так а что насчет реверсивного поиска? Его можно как то задать? Если он мордой ищет неверно? Зачем цепляться так к самому первому вхождению и считать главное что оно уже является самым коротким? Или как то зациклить этот поиск до действительно самого короткого? Как решить то то эту задачу, надо костыль мутить, я пробую обернуть весь текст в свои теги что бы целпяться удобней было, но эффект тот же, регулярка считает что она уже справилась и опять так некорректно
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Так а что насчет реверсивного поиска? Его можно как то задать? Если он мордой ищет неверно? Зачем цепляться так к самому первому вхождению и считать главное что оно уже является самым коротким? Или как то зациклить этот поиск до действительно самого короткого? Как решить то то эту задачу, надо костыль мутить, я пробую обернуть весь текст в свои теги что бы целпяться удобней было, но эффект тот же, регулярка считает что она уже справилась и опять так некорректно
Во-первых, регулярки не являются зенновской разработкой. Если тебе кажется что-то нелогичным, это значит, что ты просто не до конца понимаешь механику работы.
Во-вторых, костыли не нужны. Просто нужно более правильно составлять условия, допустимые символы и т.д. Хотя, всё же, бывают случаи, когда одной регуляркой не обойтись.
Покажи текст, я покажу регулярку без костылей
 
  • Спасибо
Реакции: serg32

serg32

Client
Регистрация
27.02.2015
Сообщения
545
Благодарностей
15
Баллы
18
Хотя, всё же, бывают случаи, когда одной
Да, это походу тот самый случай. Текст я же выше написал, он и есть, смысл один, дернуть оттуда почту. Я уже сделал костыль свой. Я просто через поиск-замену порезал все) Сначала удалил все что идет после @gmail.com, а потом удалил все что идет перед тегом >, а все что после него оставил, как раз нашу почту, а уже затем просто удалил сам тег -> в три оборота))),но работает, поэтому я и говорю про костыль
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
[^>]+@gmail\.com
 
Последнее редактирование:
  • Спасибо
Реакции: serg32

serg32

Client
Регистрация
27.02.2015
Сообщения
545
Благодарностей
15
Баллы
18

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
  • Спасибо
Реакции: serg32

serg32

Client
Регистрация
27.02.2015
Сообщения
545
Благодарностей
15
Баллы
18
потому что через конструктор регулярка имеет слишком расплывчатые условия
Жесть....А как тогда лучше составлять регулярки? Есть какой нибудь другой конструктор? Или инфа какая? Потому что такого варианта в конструкторе не собрать получается....
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
  • Спасибо
Реакции: serg32

serg32

Client
Регистрация
27.02.2015
Сообщения
545
Благодарностей
15
Баллы
18
А как дословно звучит эта регулярка получается [^>] - игнорируй все, включительно сам символ > и все что после него? А эта часть - [email protected], что искомый текст будет включать в себя @gmail.com? Так получается?
 

serg32

Client
Регистрация
27.02.2015
Сообщения
545
Благодарностей
15
Баллы
18

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
А как дословно звучит эта регулярка получается [^>] - игнорируй все, включительно сам символ > и все что после него? А эта часть - [email protected], что искомый текст будет включать в себя @gmail.com? Так получается?
[^>] - любой символ, кроме >
[^>]+ - макс. последовательность таких символов
[^>][email protected] - макс. последовательность символов, исключая >, после которой будет @gmail.com

Кстати, чутка ошибся, правильнее будет [^>]+@gmail\.com
 

kagorec

Client
Регистрация
24.08.2013
Сообщения
965
Благодарностей
510
Баллы
93
И без пробелов\табов
[^\s>] :-)
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 489
Благодарностей
3 356
Баллы
113
Жесть....А как тогда лучше составлять регулярки? Есть какой нибудь другой конструктор?
На кой вообще этот изврат с html, когда есть xPath, который намного проще...(facepalm)
 

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