Russian Qt Forum
Ноябрь 24, 2024, 22:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: поиск по QRegExp  (Прочитано 10482 раз)
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 - то результат отрицательный - текст не найден!

Как построить правильный шаблон в таком случае?
Записан
Tonal
Гость
« Ответ #1 : Сентябрь 14, 2007, 17:24 »

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

Что именно тебе надо? Почему не написать просто:
line.indexOf("{A:48:3}")
Записан
spigel
Гость
« Ответ #2 : Сентябрь 17, 2007, 09:11 »

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

последовательность {A:48:3} словом не является.
Указывая \b перед и после этой последовательности, ты требуешь, чтобы непосредственно к ней прилегали "слова".

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

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

Незнаю, баг или нет это ... но как построить правильный шаблон в этом случае?
Записан
Tonal
Гость
« Ответ #4 : Сентябрь 17, 2007, 10:17 »

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

Зачем тебе нужны регулярные выражения?
Записан
spigel
Гость
« Ответ #5 : Сентябрь 17, 2007, 10:51 »

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

Записан
spigel
Гость
« Ответ #6 : Сентябрь 17, 2007, 11:10 »


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

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

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

Исследовав работу QRegExp я выяснил что для моего случая система выполняет как раз goodStringMatch который напрямую выполняет QString::indexOf и именно из-за этого находит попадание в случае aaa{A:48:3}k, совершенно игнорируя при этом
Записан
Tonal
Гость
« Ответ #7 : Сентябрь 17, 2007, 13:25 »

чтобы решить задачу, уменьшить головную боль тех. поддержки, чтобы получить премию и выплатить по кредиту.
Класс!  Смеющийся
Так всегда и отвечай! Тогда все сразу просекут твою задачу, и выдадут горы полезных советов!
Полезный совет №1 - переходи работать постановщиком - им платят больше денег.  Смеющийся

По существу.
Чтобы нормально объяснить, что тебе надо ответь на вопросы ниже:
1) Какие строки бывают на входе (приведи 3 - 4 штуки)
2) Какие места нужно находить в этих строках (выдели в приведённых строках эти места жирным шрифтом)
3) Какие места не нужно находить в этих строках (выдели в приведённых строках эти места красным шрифтом)
Записан
spigel
Гость
« Ответ #8 : Сентябрь 17, 2007, 13:37 »

еще раз по технике и существу
необходимо, обязательно, составить pattern (шаблон) для поиска последовательности например {A:3} или [djfhj] или ,dfdjfh.
с разделением по словам!

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

пример шаблона: aa|\b\{Ad\{5\}\}\b
который должен найти любое попадание aa или отдельной последовательности {Ad{5}}
Записан
alexis
Гость
« Ответ #9 : Сентябрь 17, 2007, 14:00 »

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

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

P.S. Зайди на intuit.ru и зпришись на курсы по регулярныv выражениям - узнаешь много интересного. ;-)
Записан
spigel
Гость
« Ответ #11 : Сентябрь 17, 2007, 15:08 »

alexis: да, спасибо! интересно узнать новые возможности библиотеки!
строка эскейпится верно, но для этого лучше всего использовать готовую библиотечную функцию!


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

задачка почти решена, переводом non-word символов в словные.
ждем рекомендации и комментариев из Trolltech
Записан
spigel
Гость
« Ответ #12 : Сентябрь 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 или " ".


Записан
Tonal
Гость
« Ответ #13 : Сентябрь 17, 2007, 16:53 »

для 2 и 3 \B\{A:2\}\B
для 4 - обычный indexOf

Твоё понимание "слова" не имеет никакого отношения к регулярным выражениям.
Читай первоисточники! ;-)
Записан
spigel
Гость
« Ответ #14 : Сентябрь 17, 2007, 17:12 »

жаль, что твое понимание задачи и проблемы свелось к явной частности.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.126 секунд. Запросов: 20.