Название: [РЕШЕНО] Помогите составить регексп (или не регексп) Отправлено: Alp от Сентябрь 25, 2009, 22:56 Надо произвольную html-строку побить на части используя следующее правило: строка должна быть побита по пробелам без оставления пустых кусков (три пробела подря не трактуются как пять пустых строк между ними), за исключением текста заключенного в тэги <a href="not important what here"></a>, который может содержать пробелы, но в итоговом списке должен быть одной строкой.
Пример: - строка="Однажды в <a href="qweqwe">студеную зимнюю<a/> пору\nСижу <a href="zc">за решеткой в</a> темнице сырой" - результат: ( ("Однажды", "в", "студеную зимнюю", "пору"), ("Сижу", "за решеткой в", "темнице", "сырой") ) Я уже всю голову сломал пытаясь решить эту задачу красиво что с регекспами, что без них. Без них - и по пробелам бил, предварительно удалив все теги, а потом искал нужную последовательность (нет гарантии, что эта последовательность не появится в другом месте) и посимвольно проходился (совсем дурацкий способ с непонятны кодом - не уверен, что сам его пойму через месяц). В обещем, умные идеи в голову не идут. Название: Re: Помогите составить регексп (или не регексп) Отправлено: _OLEGator_ от Сентябрь 26, 2009, 00:19 Сначала заменить в строке все повторяющиеся пробелы, обрезать крайние пробелы и применить следующую функцию:
Код
Название: Re: Помогите составить регексп (или не регексп) Отправлено: zenden от Сентябрь 26, 2009, 00:49 Код
Удаляем теги простейшим способом, ищем непробельные последовательности и на выходе в result получаем массив stringlist-ов Название: Re: Помогите составить регексп (или не регексп) Отправлено: Alp от Сентябрь 26, 2009, 11:22 Удаляем теги простейшим способом, ищем непробельные последовательности и на выходе в result получаем массив stringlist-ов Почти получилось, но не то - если внутри гиперлинка текст с пробелами, то он будет разделен на две строки в стринглисте. По условию - текст внутри гиперлинка должен быть сохранен как одна строка. А разделение по пробелам я уже давно делал. Название: Re: Помогите составить регексп (или не регексп) Отправлено: Alp от Сентябрь 26, 2009, 11:24 Сначала заменить в строке все повторяющиеся пробелы, обрезать крайние пробелы и применить следующую функцию: Во! Это почти то, что надо! Спасибо! Она немного сломалась, если теги ссылки окружены еще тегами <nobr></nobr>, но с этим я уже сам разберусь. Спасибо. А можешь немного пояснить что этот регексп из себя представляет? "<a [^>]*>[^>]*</a>" - вот это я понимаю, соотвествует тому, что находится внутри гиперссылки включая теги, а вот зачем эта последовательность заключена в трубы, перед ней ищется пробел и в конце ищется "\n" - непонятно. Название: Re: Помогите составить регексп (или не регексп) Отправлено: _OLEGator_ от Сентябрь 26, 2009, 12:22 Просто последовательно ищется первое вхождение символов "пробела", тегов <a>, либо символа перевода строки, вот такое регулярное выражение и получается:
( - пробел | - или <a [^>]*>[^>]*</a> - полностью выражение в гиперссылке | - или \\n - символ перевода строки ) Как я понял из вопроса, надо побить по строкам, а потом по словам... Название: Re: Помогите составить регексп (или не регексп) Отправлено: Alp от Сентябрь 26, 2009, 12:37 Просто последовательно ищется первое вхождение символов "пробела", тегов <a>, либо символа перевода строки, вот такое регулярное выражение и получается: ( - пробел | - или <a [^>]*>[^>]*</a> - полностью выражение в гиперссылке | - или \\n - символ перевода строки ) Как я понял из вопроса, надо побить по строкам, а потом по словам... Ага, тогда ясно. Не могу сейчас понять вот чего - если, как я описал в ответе - гиперссылка заключена в теги <nobr>-</nobr> (что бы слова не переносились в случае наличия пробелов), тогда после текста в гиперссылке следующим элементов списка будет "/nobr>". А если просто удалить все nobr, тогда теряется символ перевода строки (если гиперрсылка в самом конце строчки, т.е. "\n" следуется сразу за тегом </a>). Для случая "Однажды в студеную зимнюю <a href="qweqwe">пору<a/>\nСижу за решеткой <a href="zc">в темнице сырой</a>" начинаются проблемы - почему-то теряются все сиволы перевода строк и в результате получаем один список. Хотя регексп соответствует и переводу строки! Почему так? Название: Re: Помогите составить регексп (или не регексп) Отправлено: _OLEGator_ от Сентябрь 26, 2009, 12:43 Не очень понятно какой случай имеется ввиду. Надо просто учеть в регулярном выражении такую ситуацию:
<nobr><a href="qweqwe">студеную зимнюю<a/></nobr> или что то другое? Поясни :) Название: Re: Помогите составить регексп (или не регексп) Отправлено: _OLEGator_ от Сентябрь 26, 2009, 18:59 Для случая "Однажды в студеную зимнюю <a href="qweqwe">пору<a/>\nСижу за решеткой <a href="zc">в темнице сырой</a>" ошибка в закрывающем теге <a/>
Измененная функция для обработки </a>\n: Код
Название: Re: Помогите составить регексп (или не регексп) Отправлено: Alp от Сентябрь 28, 2009, 12:13 Для случая "Однажды в студеную зимнюю <a href="qweqwe">пору<a/>\nСижу за решеткой <a href="zc">в темнице сырой</a>" ошибка в закрывающем теге <a/> Измененная функция для обработки </a>\n: Спасибо за помощь. Ошибка - это опечатка была, не более чем =) Проблема возникла в случае, когда символ конца строки следует непосредственно за закрывающим тегом гиперссылки. Тогда список не делился по \n. Название: Re: [РЕШЕНО] Помогите составить регексп (или не регексп) Отправлено: Alp от Сентябрь 28, 2009, 13:53 В итоге всё получилось. Я немного переписал функцию (в старом варианте ругалась на выход за пределы строки в одном из вызовов QString::at)
Код
|