Название: QRegExp greedy. Разбить текст на предложения Отправлено: thechicho от Июнь 03, 2013, 14:04 rx.setPattern("(.+(?:\\b[^А-ЯA-Z0-9])?(?:<li>|</li>|\\!|\\?|;|\\.|$))");
Код: QString str = "blablabla. blablabla3...aaaab!!!fads???ffds?asdfvxcv"; Код: rx.cap(0) "blablabla." Код: rx.cap(0) "blablabla." вопрос: как сделать эту часть \\!|\\?|;|\\. жадной (greedy) так, чтобы часть .+ оставалась не жадной(non-greedy). или есть другие варианты решения? может библиотеки готовые? нужно текст на предложения разбивать Название: Re: QRegExp greedy. Разбить текст на предложения Отправлено: tester64 от Июнь 03, 2013, 18:16 Можно использовать предваряющий поиск (?= или ?!).
Например: Код
Здесь реализована простенькая подстановка (для наглядности регэкспа и избежания ошибок при дублировании подстрок) - так удобнее эспериментировать. Кстати, смысл "(\\b[^А-ЯA-Z0-9])?" непонятен. С квантификатором ? это выражение будет просто игнорироваться. А без него - какой смысл запрещать конечные односимвольные слова в верхнем регистре?... И, если регистр не важен и не ставится целью исключить именно русский и латинский алфавиты, можно просто использовать [^\\w] или вообще \\W (в класс \w включаются произвольные алфавиты, подчерк, цифры и символы-модификаторы unicode классов Mn, Mc, Me). ЗЫ. Код на C++11. ЗЫ2. В коде удалена из регэкспа кириллица, у движка форума некорректный парсинг. Название: Re: QRegExp greedy. Разбить текст на предложения Отправлено: Bepec от Июнь 03, 2013, 18:59 Проще выражаясь средствами QRegExp никак) Он обрезанный.
Я пользуюсь deelx. Регэкспы в одном файле. Название: Re: QRegExp greedy. Разбить текст на предложения Отправлено: thechicho от Июнь 03, 2013, 20:04 спасибо за ответы!
решил проблему пока так. в принципе более менее универсально. пока устраивает rxProposal.setPattern("(.+(?:\\b?[^А-ЯA-Z0-9]|\\B[А-ЯA-Z])(?:<li>.|</li>.|[\\!\\?\\.][^\\!\\?\\.]|$))"); Код: QStringList proposals; "(\\b[^А-ЯA-Z0-9])?" это я пытался сделать обработку В.В. Путиным (с 6.05.2013 по 15.05.2013) глава США. //Я пользуюсь deelx. Регэкспы в одном файле. в чем преимущество по сравнению с QRegExp? не уверен, что deelx мне нужен. Название: Re: QRegExp greedy. Разбить текст на предложения Отправлено: Bepec от Июнь 03, 2013, 20:56 В полной поддержке рег экспов. И в отсутствии нелепых ограничений.
Название: Re: QRegExp greedy. Разбить текст на предложения Отправлено: m_ax от Июнь 03, 2013, 21:02 Регулярки всё же немного для другого созданы..
Я бы смотрел в сторону boost::tokenizer. Правда там мы не узнаем символы конца предложения (?). В готовых решениях уже приводилось два класса для таких целей. Код
Вывод: Код
Название: Re: QRegExp greedy. Разбить текст на предложения Отправлено: thechicho от Июнь 04, 2013, 11:03 //В полной поддержке рег экспов. И в отсутствии нелепых ограничений.
да вроде неплохая реализация. какие нелепые ограничения? //Регулярки всё же немного для другого созданы.. для чего? https://support.google.com/analytics/answer/1034324?hl=ru Цитировать Регулярными выражениями называют специальные символы, используемые для сравнения или извлечения фрагментов поля, а также правила, которыми регулируются все символы нужен был такой вывод, с получением которого возникла сложность Код: abc. http://rakafon.blogspot.ru/2009/04/boosttokenizer.html Цитировать Использование boost::tokenizer спасибо за совет, но судя по описанию, ограничусь регуляркой, т.к. мне не нужен идеальный результат.Нередко в практике программистов встречаются задачи, когда нужно разобрать строку (как еще иногда говорят - распарсить). Решений этой задачи - множество. Это и простейший поиск очередного символа-разделителя, и регулярные выражения, и специальные алгоритмы (например, из коллекции boost::string_algo). Но иногда логика разбиения строки на части (т. е. логика разбора) может быть ну совсем уж специфичная. Или регулярное выражение получается очень уж навороченное. Или по каким-то причинам библиотека регулярных выражений (тот же boost::regex) неприменима. Тогда на помощь может придти boost::tokenizer. достаточно, чтобы такого деления не было 6.05.2013 Код: 6. |