2017-02-13 5 views
1

Мне нужна помощь в создании некоторых замен строк, с регулярными выражениями.Регулярные выражения, возвращающие пустые строки

Задача: масштабировать шрифты в сгенерированной строке html. Я использую Qt, должен работать в Qt 4.8.

Я определил некоторое регулярное выражение, чтобы отделить раздел, содержащий размеры шрифта, и протестировал его (https://regex101.com/r/Y0W13N/1). Я не знаю, правильное или оптимальное, но тестовый сайт, похоже, дает мне правильный результат - но я, кажется, не получить ни одного матча в моем коде:

// get string between "<span style=\"" and "\">" (escaped quotes and backslashes) 
QRegExp rx1("<span style=\"(?:=([^\\]]+))?(.*?);\">"); 
int pos = rx1.indexIn(text); 
QStringList listSpans1 = rx1.capturedTexts(); 
qDebug() << listSpans1;        // outputs ("", "", "") 

// get string between "<p style=\"" and "\">" 
QRegExp rx2("<p style=\"(?:=([^\\]]+))?(.*?);\">"); 
pos = rx2.indexIn(text); 
QStringList listSpans2 = rx2.capturedTexts(); 
qDebug() << listSpans2;        // outputs ("", "", "") 

text Я тестирую с является

"<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> 
<html><head><meta name="qrichtext" content="1" /><style type="text/css"> 
p, li { white-space: pre-wrap; } 
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-weight:400; font-style:normal;"> 
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Some Font'; font-size:15pt; color:#000000;">Te</span><span style=" font-family:'Some Font'; font-size:9pt; color:#000000;">xt</span></p> 
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Some Font'; font-size:9pt; color:#000000;"></p> 
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Some Font'; font-size:9pt; color:#000000;"> B</span><span style=" font-family:'Some Font'; font-size:15pt; color:#000000;">ox</span></p> 
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Some Font'; font-size:18pt; color:#000000;"></p></body></html>" 

Я получаю пустые строки из qDebug - Я не понимаю, почему, учитывая, что испытательный полигон показывает мне corr и т. д., и что я, похоже, получаю спички? Почему пусто ...

(Следующий шаг - отделить часть шрифта ... определить размер шрифта ... масштабировать его ... заменить обратно ... кажется очень сложным для такой простой операции, но я не мог найти более простой способ)

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

Пожалуйста, помогите получить мои регулярные выражения работают ... Спасибо

+0

побега каждого специальным символом еще один раз - например, \ "-> \\\", \\ -> \\\\ и т. д. –

+1

Используйте '' regex + 'rx1.setMinimal (true)'. То же самое со вторым регулярным выражением ('

'/'Rx2.setMinimal (true)') –

+0

@Wiktor Stribiżew вы можете поместить это как ответ, пожалуйста? – Thalia

ответ

1

Дело в том, что вы не можете использовать ленивые *?/+? кванторов в Qt RegExp.

Вы можете решить эту проблему с помощью rx1.setMinimal(true) и используя .* рисунок как группа 1 схему:

QRegExp rx1("<span style=\"(.*);\">"); 
rx1.setMinimal(true); 

же со вторым регулярным выражением:

QRegExp rx2("<p style=\"(.*);\">"); 
rx2.setMinimal(true);