<span разные_атрибуты> </span><span разные_атрибуты> </span><span разные_атрибуты> </span>
<span разные_атрибуты>��</span><span разные_атрибуты>����</span><span разные_атрибуты>�</span>
QRegExp replaceSpaceTagsEx("<span.*>(\\s*)</span>");replaceSpaceTagsEx.setMinimal(true);htmlCode.replace(replaceSpaceTagsEx, "?????");
C++ (Qt)QString regex_replace(const QString & input, const RegExp & regex, const std::function<QString(const QString &)> & format_func);
C++ (Qt)template <class FormatFunc>QString regex_replace(const QString & input, const QRegExp & regex, FormatFunc format_func){ int pos = 0; QStringList list; QList<QPair<int, int>> ranges; while ((pos = regex.indexIn(input, pos)) != -1) { ranges << qMakePair(regex.pos(1), regex.pos(1) + regex.cap(1).size()); list << format_func(regex.cap(1)); pos += regex.matchedLength(); } int space_count = 0; int rep_space_count = 0; auto it = list.begin(); for (auto & r : ranges) { space_count += r.second - r.first; rep_space_count += it->size(); } QString out; out.reserve(input.size() - space_count + rep_space_count); it = list.begin(); pos = 0; for (auto & r : ranges) { out.append(QStringRef(&input, pos, r.first-pos)); out.append(*it++); pos = r.second; } out.append(QStringRef(&input, pos, input.size()-pos)); return out;} int main(){ QString str = "<span> </span> text text text <span> </span> text TeXt <span> </span>bla-bla-bla"; QRegExp rx("<span.*>(\\s*)</span>"); rx.setMinimal(true); qDebug() << regex_replace(str, rx, [](const QString & str)->QString { QString rep = "&#65533;"; return rep.repeated(str.size()); }); return 0;}
C++ (Qt)#include <QtWidgets> typedef QPair<int, int> TPair;typedef QVector<TPair> TVec; TVec CollectPairs( const QString & src, const QString & begStr, const QString & endStr ){ TVec dst; int pos = 0; while (true) { int beg = src.indexOf(begStr, pos); if (beg < 0) return dst; int pos2 = pos = beg + begStr.size(); int end = src.indexOf(endStr, pos); if (end < 0) return dst; pos = end + endStr.size(); for (int mid = end - 1; mid >= pos2; --mid) { if (src[mid] == ' ') continue; if (src[mid] == '>') dst.push_back(TPair(mid + 1, end)); break; } } return dst;} QString ReplaceBlanks( const QString & src ){ QString dst; const QString & spaceTxt("&#65533;"); int srcPos = 0; TVec vec = CollectPairs(src, "<span", "</span>"); for (int i = 0; i < vec.size(); ++i) { int beg = vec[i].first; int end = vec[i].second; dst += QStringRef(&src, srcPos, beg - srcPos); for (int j = beg; j < end; ++j) dst += spaceTxt; srcPos = end; } dst += QStringRef(&src, srcPos, src.size() - srcPos); return dst;} int main(int argc, char *argv[]){ const char * testStr = "<span разные_атрибуты> </span>\n" "<span разные_атрибуты> </span>\n" "<span разные_атрибуты> </span>"; qDebug() << ReplaceBlanks(testStr); return 0;}
QString test = "<span разные_атрибуты> </span>" "<span разные_атрибуты> </span>" "<span разные_атрибуты> </span>"; QRegExp rx = QRegExp("(<span.*>)(\\s*)(</span>)"); rx.setMinimal(true); int pos = 0; while ( (pos=rx.indexIn(test,pos)) != -1) { QString tmp = QString("�").repeated( rx.cap( 2 ).length() ); test.replace( pos, rx.matchedLength(), rx.cap(1) + tmp + rx.cap(3) ); pos += rx.matchedLength() + tmp.length() - rx.cap( 2 ).length(); } qDebug().noquote() << test;
C++ (Qt)template <class FormatFunc>QString regex_replace(const QString & input, const QRegExp & regex, FormatFunc format_func){ QString out = input; int pos = 0; while ((pos = regex.indexIn(out, pos)) != -1) { auto s = format_func(regex.cap(1)); out.replace( pos, regex.matchedLength(), s ); pos += s.length(); } return out;}
C++ (Qt)out.replace( pos, regex.matchedLength(), s );
C++ (Qt)struct CReplacer { CReplacer( const QString & src ); virtual bool Find( QStringRef & ref ) const; virtual QString Replace( const QStringRef & ref ) const;..};