Russian Qt Forum

Qt => Общие вопросы => Тема начата: spigel от Сентябрь 14, 2007, 17:04



Название: поиск по QRegExp
Отправлено: spigel от Сентябрь 14, 2007, 17:04
Всем привет!

использую QRegExpv2, можно смотреть в примере examples/tools/regexp
в строке aaa{A:48:3} {A:48:3} пытаюсь обнаружить слово {A:48:3} с шаблоном \b\{A:48:3\}\b
буквы \b обозначают границы слова, перед { стоит \ = т.к. { - является спецзнаком в QRegExp

в результате поиск возвращает -1
но как только я меняю текст на aaa{A:48:3}r {A:48:3}, то мне выдает index of match = 3,
которое указывает на середину слова aaa{A:48:3} когда в шаблоне точно указан поиск по границам слов!
в итоге если текст будет {A:48:3}, а шаблон \b\{A:48:3\}\b - то результат отрицательный - текст не найден!

Как построить правильный шаблон в таком случае?


Название: Re: поиск по QRegExp
Отправлено: Tonal от Сентябрь 14, 2007, 17:24
Словом в языке регулярных выражений называется непрерывная последовательность из одного или более символов алфавита цифр и "_"...
Так что последовательность {A:48:3} словом не является.
Указывая \b перед и после этой последовательности, ты требуешь, чтобы непосредственно к ней прилегали "слова".
Так что всё отрабатывает верно. Другое дело, что может тебе надо не совсем это.

Что именно тебе надо? Почему не написать просто:
line.indexOf("{A:48:3}")


Название: Re: поиск по QRegExp
Отправлено: spigel от Сентябрь 17, 2007, 09:11
надо построить шаблон для поиска такой последовательности, так чтобы к последовательности могли прилегать символы разделения слов (пробел, табуляция и т.п == isWhiteSpace().
именно в режиме RegExpv2 - не переключаясь в whildcard или fixed string


Название: Re: поиск по QRegExp
Отправлено: spigel от Сентябрь 17, 2007, 09:20
последовательность {A:48:3} словом не является.
Указывая \b перед и после этой последовательности, ты требуешь, чтобы непосредственно к ней прилегали "слова".

Так что всё отрабатывает верно. Другое дело, что может тебе надо не совсем это.

в любом случае указывая \b я требую что в этом месте была граница слова (word boundary),
я не устанавливаю никаких требований к объектам прилегающим к моей последовательности (слова они, цифры или рисунки).
Главное чтобы мою последовательность отделяло от них границей. поэтому нет термина начало границы, конец, а есть просто требование по последовательности: граница...символы...граница
////////////

Незнаю, баг или нет это ... но как построить правильный шаблон в этом случае?


Название: Re: поиск по QRegExp
Отправлено: Tonal от Сентябрь 17, 2007, 10:17
Ещё раз:
Если тебе надо найти в тексте именно "{A:48:3}" то почему тебе не использовать просто поиск подстроки?

Зачем тебе нужны регулярные выражения?


Название: Re: поиск по QRegExp
Отправлено: spigel от Сентябрь 17, 2007, 10:51
чтобы решить задачу, уменьшить головную боль тех. поддержки, чтобы получить премию и выплатить по кредиту.



Название: Re: поиск по QRegExp
Отправлено: spigel от Сентябрь 17, 2007, 11:10

Если тебе надо найти в тексте именно "{A:48:3}" то почему тебе не использовать просто поиск подстроки?

Зачем тебе нужны регулярные выражения?

отделить мою последовательность от других, указав специально что где должны быть разделители слов (границы)

Исследовав работу QRegExp я выяснил что для моего случая система выполняет как раз goodStringMatch который напрямую выполняет QString::indexOf и именно из-за этого находит попадание в случае aaa{A:48:3}k, совершенно игнорируя при этом


Название: Re: поиск по QRegExp
Отправлено: Tonal от Сентябрь 17, 2007, 13:25
чтобы решить задачу, уменьшить головную боль тех. поддержки, чтобы получить премию и выплатить по кредиту.
Класс!  ;D
Так всегда и отвечай! Тогда все сразу просекут твою задачу, и выдадут горы полезных советов!
Полезный совет №1 - переходи работать постановщиком - им платят больше денег.  ;D

По существу.
Чтобы нормально объяснить, что тебе надо ответь на вопросы ниже:
1) Какие строки бывают на входе (приведи 3 - 4 штуки)
2) Какие места нужно находить в этих строках (выдели в приведённых строках эти места жирным шрифтом)
3) Какие места не нужно находить в этих строках (выдели в приведённых строках эти места красным шрифтом)


Название: Re: поиск по QRegExp
Отправлено: spigel от Сентябрь 17, 2007, 13:37
еще раз по технике и существу
необходимо, обязательно, составить pattern (шаблон) для поиска последовательности например {A:3} или [djfhj] или ,dfdjfh.
с разделением по словам!

что уж тут непонятного?
про word-characters: символы не слова критичны только около границы, если они отделены от нее word-letter то все работает как ожидается

пример шаблона: aa|\b\{Ad\{5\}\}\b
который должен найти любое попадание aa или отдельной последовательности {Ad{5}}


Название: Re: поиск по QRegExp
Отправлено: alexis от Сентябрь 17, 2007, 14:00
Может не к месту, но обратите внимание на вот это:
Код:
 s1 = QRegExp::escape("bingo");   // s1 == "bingo"
 s2 = QRegExp::escape("f(x)");    // s2 == "f\\(x\\)"
то есть, я хочу сказать, что, возможно, вы неверно эскейпите строку для рег-экспа.
нужно это делать дважды или использовать выше описанную функцию.


Название: Re: поиск по QRegExp
Отправлено: Tonal от Сентябрь 17, 2007, 14:24
необходимо, обязательно, составить pattern (шаблон) для поиска последовательности например {A:3} или [djfhj] или ,dfdjfh.
с разделением по словам!
Что такое "слово" в твоём понимании?
Что ты подразумеваешь под "составить pattern ... с разделением по словам"?

P.S. Зайди на intuit.ru и зпришись на курсы по регулярныv выражениям - узнаешь много интересного. ;-)


Название: Re: поиск по QRegExp
Отправлено: spigel от Сентябрь 17, 2007, 15:08
alexis: да, спасибо! интересно узнать новые возможности библиотеки!
строка эскейпится верно, но для этого лучше всего использовать готовую библиотечную функцию!


спасибо, тов. Tonal за твердую линию партии. конечно надо разобраться кто тут еще достойный остался?

задачка почти решена, переводом non-word символов в словные.
ждем рекомендации и комментариев из Trolltech


Название: Re: поиск по QRegExp
Отправлено: spigel от Сентябрь 17, 2007, 15:32
1) Какие строки бывают на входе (приведи 3 - 4 штуки)
2) Какие места нужно находить в этих строках (выдели в приведённых строках эти места жирным шрифтом)
3) Какие места не нужно находить в этих строках (выдели в приведённых строках эти места красным шрифтом)

1) на входе, любая последовательность символов, например:

a.{A:2}
b. avacado
c.  man'sand womens' eat abuz ev day: {A:2:3} +{a:2}
d: ..?d{A:2}
e: and {A:2}

2) если запрос для поиска "{A:2}", то ищем точную последовательность {A:2}, как отдельное слово, из приведенных выше примеров.
совпадения для строки a), e), c)

3) не нужно находить d)

4) если в запросе убрали "" то ищем просто попадание последовательности символов без словных границ
т.е. в результате true для a), c), d), e)

слово это последовательность символов заключенная между \b\b или " ".




Название: Re: поиск по QRegExp
Отправлено: Tonal от Сентябрь 17, 2007, 16:53
для 2 и 3 \B\{A:2\}\B
для 4 - обычный indexOf

Твоё понимание "слова" не имеет никакого отношения к регулярным выражениям.
Читай первоисточники! ;-)


Название: Re: поиск по QRegExp
Отправлено: spigel от Сентябрь 17, 2007, 17:12
жаль, что твое понимание задачи и проблемы свелось к явной частности.


Название: Re: поиск по QRegExp
Отправлено: spigel от Сентябрь 17, 2007, 17:19
и как ты будешь искать выражение

ну и какой шаблончик ты составишь для поиска отдельной последовательности {A:2}
в следующем тексте?

a{A:2} AaaA:2} a:2 {a:2k} [b}{a:2}[\b] {a:2}d

наверное как-то узнаешь что нужно сделать в этом случае indexOf???
интересно, а как ты узнаешь что в каком месте последовательность {a:2}  отделена от других?
интересно, а у тебя в этом случае шаблон \b\{a:2\}\b  ,что найдет?



Название: Re: поиск по QRegExp
Отправлено: Tonal от Сентябрь 17, 2007, 17:54
Это тебе что-то надо а не мне, правильно?
Я для условий из http://prog.org.ru/forum/index.php/topic,6235.msg28159.html#msg28159 решение показал?
И кто виноват, в том что не может внятно объяснить что ему надо?
Наверное я? ;-)


Название: Re: поиск по QRegExp
Отправлено: spigel от Сентябрь 18, 2007, 10:35
по твоему ответу я задал вопросы какие считаю нужным обязательно задать.
хочешь - отвечай хочешь нет,

:-D
бред какой-то ....

Кто виноват???? - ну позвони в милицию там знают кто виноват!



Название: Re: поиск по QRegExp
Отправлено: spigel от Сентябрь 18, 2007, 14:08
вот выдержка из письма от Trolltech

"This looks like a bug in Qt 4.3 actually, it seems that checking for word boundaries doesn't work well with the {'s next to it.  Therefore I've created task 179469 for our development team. You can use this ID to track the status of this task online."


Название: Re: поиск по QRegExp
Отправлено: Tonal от Сентябрь 18, 2007, 20:10
Можешь запостить баг ещё и разработчикам Perl-а т.к. там тоже не находит.
А за одно ещё и разработчикам Python-а, php, JScript (Microsoft) - и там "не работает" точно также. ;-)

P.S. QRegExp::RegExp, QRegExp::RegExp2 - A rich Perl-like pattern matching syntax...


Название: Re: поиск по QRegExp
Отправлено: spigel от Сентябрь 19, 2007, 09:03
странно а зачем им?

с троллтехом обсуждал вопрос, как сделать в этом случае поиск.

Они самостоятельно пришли к выводу, что нужно открыть "баг".

В отличии от Tonal, проблему поняли и в переводе на английском.


Название: Re: поиск по QRegExp
Отправлено: Tonal от Сентябрь 19, 2007, 09:59
странно а зачем им?
Пример который описан в багрепорте у них отрабатывает точно так же как и в Qt
Пусть тоже вылечат свои застарелые грабли. ;-)

с троллтехом обсуждал вопрос, как сделать в этом случае поиск.
Они самостоятельно пришли к выводу, что нужно открыть "баг".
Им всяко было проще зарегистрировать баг, чем учить тебя регулярным выражениям. ;-)