Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярное выражение (boost.regex), --> Как запретить 2+ повторения строки 
:(
    Опции темы
_Alex
Дата 2.6.2007, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 9.3.2007

Репутация: нет
Всего: нет



Как запретить 2+ повторения строки, в регулярном выражении?

Допустим есть текст:
Код

<!------результат 1-------->
<br class="lb">
<a class="res" href="http://localhost/">Совпадение 1
</a>
<br></span>

<!------результат 2-------->
<br class="lb">
<a class="res" href="http://localhost/">Совпадение 1
</a>
<br class="lb">
<a class="res" href="http://sub.localhost/">Обратите внимание, это тоже содержит совпадение 1 
</a>
<br></span>

-------------------

Регулярное выражение:
Код

<br class="lb"><a class="res" href="([^"]+)">(.+?)</a><br></span>


Как сделать чтобы "результат 2", не соответствовал регулярному выражению?

т.е.
Как составить регулярное выражение, чтобы
<br class="lb"><a class="res" href="([^"]+)">(Всё кроме </a>)</a><br></span>

Код

const string text = указан выше
const char* re = "<br class=\"lb\"><a class=\"res\" href=\"([^\"]+)\">(.+?)</a><br></span>";

    try
    {
    boost::regex expression(re);
    std::string::const_iterator start = text.begin();
    std::string::const_iterator end = text.end();
    boost::match_results<std::string::const_iterator> what;
    boost::match_flag_type flags = boost::match_default;
        while(boost::regex_search(start, end, what, expression, flags))
        {
        cout << what[1] << "\n\nwhat[2]:\n" << what[2] << endl;
        start = what[0].second;
        flags |= boost::match_prev_avail;
        flags |= boost::match_not_bob;
        }
    catch(...)
    {
    cout << "error in boost regex" << endl;
    }






PM MAIL   Вверх
W4FhLF
Дата 2.6.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Слишком мало условий начальных. Как ты предлогаешь отличать первый результат от второго? Можно по закрывающему тегу </span>, но тогда "Обратите внимание, это тоже содержит совпадение 1" тоже попадает под правильное условия, можно делать ретроспективную проверку на </span>, но тогда самый первый результат в файле не будет учтён. В общем, я что-то не могу увидеть чётких отличий по которым можно составить маску... 

Давай определимся в чём у нас есть отличия между:

Код

<br class="lb">
<a class="res" href="http://localhost/">Совпадение 1
</a>
<br></span>


и

Код

<br class="lb">
<a class="res" href="http://sub.localhost/">Обратите внимание, это тоже содержит совпадение 1 
</a>
<br></span>


Только в значении тега href? Тогда от него и надо плясать. 

У меня выражение: <br class="lb">(\x0D\x0A)?<a class="res" href="([^"]+)">([^<>]+?)(\1)?</a>(\1)?<br>(\1)?</span>
Совпадает как раз с двуям этими участками, вот первый от второго как-то отличить надо.

Это сообщение отредактировал(а) W4FhLF - 2.6.2007, 10:40


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
W4FhLF
Дата 2.6.2007, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Ну вот, единственная мысль делать так:

Цитата

[^a].(\x0D\x0A)?<br class="lb">(\1)?<a class="res" href="([^"]+)">([^<>]+?)(\1)?</a>(\1)?<br>(\1)?</span>


Тогда будет такой результат:

Цитата

->
<br class="lb">
<a class="res" href="http://localhost/">Совпадение 1
</a>
<br></span>


Потом первые два символа искусственно отсекать. Но опять же, неизвестно есть ли наверняка перед первым результатом два каких-либо символа?


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
_Alex
Дата 2.6.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 9.3.2007

Репутация: нет
Всего: нет



Цитата(W4FhLF @  2.6.2007,  10:38 Найти цитируемый пост)
Давай определимся в чём у нас есть отличия между:

W4FhLF, Я имею в виду 
Цитата(_Alex @  2.6.2007,  08:49 Найти цитируемый пост)
<br class="lb"><a class="res" href="([^"]+)">(Всё кроме </a>)</a><br></span>
, что мне надо, получить результаты из блоков кода которые ты выделил.

На данный момент, Если выполнить код с моим рэгэкспом, то найденный второй полный результат $0 (второй цикл while, см. код) это вся разметка после "<!------результат 2-------->", а $2 в этом результате
<br class="lb"><a class="res" href="([^"]+)">(.+?)</a><br></span>
это:
Код

Совпадение 1    
</a>    
<br class="lb">    
<a class="res" href="http://sub.localhost/">Обратите внимание, это тоже содержит совпадение 1


А мне надо чтобы 1 и 2 полные результаты ($0), были те которые ты выделил.
И соответственно $2 во втором полном результате был "Обратите внимание, это тоже содержит совпадение 1"




PM MAIL   Вверх
W4FhLF
Дата 2.6.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



_Alex, у меня boost не стоит и ставить неохото, я проверяю на другом движке и поэтому извини, твой пример заюзать не могу. Давай ты просто мне скажешь, что тебе надо получить на выходе, прям покажи на куске текста, который привёл. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
_Alex
Дата 3.6.2007, 06:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 9.3.2007

Репутация: нет
Всего: нет



Цитата(W4FhLF @  2.6.2007,  15:49 Найти цитируемый пост)
 что тебе надо получить на выходе, прям покажи на куске текста

Код

<!------результат 2-------->
<br class="lb">
<a class="res" href="http://localhost/">Эта ссылка, и то что выше не должно попадать в результы рэгэкспа
</a>

<br class="lb">
<a class="res" href="http://sub.localhost/">Совпадение
</a>
<br></span>

Нужны результаты ($0 -- весь найденный текст, $1,$2 -- то что в скобках рэгэкспа):
$0 =
<br class="lb">
<a class="res" href="$1">$2
</a>
<br></span>

Одним рэгэкспом в boost наверно не обойтись, придётся делать еще цикл поиска в каждом найденном $0 или писать свою функцию по извлечению результатов.



PM MAIL   Вверх
W4FhLF
Дата 3.6.2007, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(_Alex @  3.6.2007,  06:43 Найти цитируемый пост)
Одним рэгэкспом в boost наверно не обойтись, придётся делать еще цикл поиска в каждом найденном $0 или писать свою функцию по извлечению результатов.


В перле есть такая возможность, а вот насчёт boost::regex я не в курсе, подозреваю, что придётся циклом. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0472 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.