crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Регулярные выражения, замена текущего патерна, не могу понять как это сделать
ViGOur
  опции профиля:
сообщение 18.4.2008, 11:02
Сообщение #1


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Есть код:
// szExp = "<a href=([^>]+)>([^<]+)</a>";
// rszData = "<li><a href="how-to-learn-qt.html">Как изучать Qt</a></li><li><a href="installation.html">Установка</a></li>";
void ReplaceRegText( const QString szExp, QString &rszData)
{
    QString sz1, sz2;
    QRegExp rx( szExp, Qt::CaseInsensitive);
    int pos = rx.indexIn( rszData);
    while( ( pos = rx.indexIn( rszData, pos)) != -1)
    {
        QString szUrl = rx.cap( 1);
        QString szText = rx.cap( 2);

        QString szTmp = "[[" + szUrl + " | " + szText + "]]";
        rszData.replace( rszData, szTmp); // проблемная строка
        
        pos += rx.matchedLength();
    }
}
Если сделать rszData.replace( rszData, szTmp), то заменится вся строка и получится:
Цитата
"<li>[[how-to-learn-qt | Как изучать Qt]]</li><li>[[how-to-learn-qt | Как изучать Qt]]</li>"
Разумеется это не правильно.
Как правильно нужно менять в данном случае?

Хехе, проблемы снята, все оказалось проще просто, в прочем как обычно.

Нужно было просто получить анализируемый по данному паттерну текст:
QString szPattern = rszData.mid( pos, rx.matchedLength());
ну и заменить его:
rszData.replace( rszData, szTmp); // больше не проблемная строка


p.s. это я делаю пробы преобразования qt документации в формат вики. :)

Сообщение отредактировал Admin - 21.4.2008, 10:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 18.4.2008, 12:11
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Вроде документашка Qt-шная в XHTML-е живёт.
А XHTML - это XML, значит обрабатывать его проще/лучше с помощью QtXml-я, а не regex-пов.
К тому же этот regex не найдёт ссылки, если там будет ещё какой-нибудь атрибут кроме href-а.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 18.4.2008, 12:32
Сообщение #3


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата
Вроде документашка Qt-шная в XHTML-е живёт.
А XHTML - это XML, значит обрабатывать его проще/лучше с помощью QtXml-я, а не regex-пов.
ИМХО, проще regexp'ом, так как мне нужно всего навсего поменять a href, a name, и image, другие теги вроде дружатся. И будет проще потому выдирать из вики для передачи в ассистент в таком случае.

Цитата
К тому же этот regex не найдёт ссылки, если там будет ещё какой-нибудь атрибут кроме href-а.

Я уже понял, переделал его. :)
Цитата
<a href=\"([^\"]*)\"[^<>]*>([^<]+)</a>

Вот только не могу понять как его дописать, чтобы еще без кавычек href хватался.
Не только такой
<a href="how-to-learn-qt.html">Как изучать Qt</a>
но и такой
<a href=how-to-learn-qt.html>Как изучать Qt</a>

Сообщение отредактировал ViGOur - 18.4.2008, 12:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.4.2008, 15:50
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата
Вот только не могу понять как его дописать, чтобы еще без кавычек href хватался.

может вместо:
[^\"]*

так написать:
[^\"].*

точка означает что может и нуль раз, если я правильно регулярные выражения понял.

я эксперементировал пару дней назад с тролевским примерчиком, такие строки обнаружить пытался:
<td width="30%">Copyright &copy; 2005 <a href="trolltech.html">Trolltech</a></td>
<td width="30%">Copyright &copy; 2005 <a href=trolltech.html>Trolltech</a></td>

вот такой шаблон подобрал:
(<[^>]+>)(Copyright\s+&copy;\s+200\d\s+)(<[^>]+>)(Trolltech)(<[^>]+>)(<[^>]+>)


---
но у меня небыло цели тэг анализировать!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 21.4.2008, 12:28
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Цитата(ViGOur @ 18.4.2008, 16:32) *
Цитата
К тому же этот regex не найдёт ссылки, если там будет ещё какой-нибудь атрибут кроме href-а.

Я уже понял, переделал его. :)
Цитата
<a href=\"([^\"]*)\"[^<>]*>([^<]+)</a>

Вот только не могу понять как его дописать, чтобы еще без кавычек href хватался.
Не только такой
<a href="how-to-learn-qt.html">Как изучать Qt</a>
но и такой
<a href=how-to-learn-qt.html>Как изучать Qt</a>

Как то так (в перловом синтаксисе):
<a\s*(?:(?!href=)[\w=\s]*)href=("([^"]*)"|[^\s>]+)[^>]*>([^<]+?)</a>

Только имей в виду, если внутри тега, в тексте, встретятся другие, например b - оно обломается...
Как это обойти - сейчас лезть смотреть лениво.

Сообщение отредактировал Tonal - 21.4.2008, 12:53
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 7:56