QRegularExpression — найти соответствие с фиксированной длиной в обратном направлении

Я могу найти предыдущее совпадение с этим, но то, что я не могу сделать, это захватить длину совпадающей строки:

int pos = 0;

if((pos = text.lastIndexOf(QRegularExpression(pattern), cursorPosition - 1)) != -1))
cout << "Match at position: " << pos << endl;

Я могу захватить длину матча с QRegularExpressionMatch, но я не смог найти флаг / опцию в QRegularExpression ни QRegularExpressionMatch классы, которые могли бы изменить направление поиска. (Я не имею в виду обратить образец, но нахожу первое совпадение перед определенной позицией в строке.)

Пример (я хочу найти не-даже-регулярное выражение "hello"):

    hello world hello
^
start (somewhere in the middle)

И это должен быть соответствующий раздел:

   hello world hello
^   ^
start  end

Заранее спасибо.

1

Решение

Обратите внимание, что в Qt5 QRegExp !знак равно QRegularExpression и я намного лучше знаком с QRegExp. Тем не менее, я не могу найти способ сделать то, что вы хотите с QRegularExpression или QRegularExpression :: match ().

Я бы вместо этого использовал QString :: IndexOf искать вперед и QString :: LastIndexOf искать в обратном направлении. Вы можете сделать это с помощью QRegExp или QRegularExpression, если вы просто хотите найти смещение.

Например,

int pos = 8;
QString text = "hello world hello";
QRegularExpression exp("hello");

int bwd = text.lastIndexOf(exp, pos);   //bwd = 0
int fwd = text.indexOf(exp, pos);       //fwd = 12

//"hello world hello"// ^       ^   ^
//bwd     pos fwd

Однако вы также хотите использовать захваченный текст, а не просто знать, где он находится. Это где QRegularExpression, кажется, не удается. Насколько я могу судить, не существует lastMatch () для извлечения совпавшей строки после вызова QString :: lastIndexOf () QRegularExpress.

Если вы вместо этого используете QRegExp, вы можете сделать это:

int pos = 8;
QString text = "hello world hello";
QRegExp exp("hello");

int bwd = text.lastIndexOf(exp, pos);   //bwd = 0
int fwd = text.indexOf(exp, pos);       //fwd = 12

//"hello world hello"// ^       ^   ^
//bwd     pos fwd

int length = exp.cap(0).size();     //6... exp.cap(0) == "hello"//or, alternatively
length = exp.matchedLength();       //6

Объект QRegExp, который вы передаете методу QString, обновляется с помощью захваченных строк, которые вы затем можете использовать и манипулировать ими. Я не могу представить, что они забыли сделать это с QRegularExpression, но похоже, что они могли бы.

2

Другие решения

Это можно сделать с помощью QRegularExpression. Просто используйте метод

QRegularExpressionMatch QRegularExpression::match(const QString &subject, int offset = 0, MatchType matchType = NormalMatch, MatchOptions matchOptions = NoMatchOption) const

а потом вызывать методы capturedLen(int), capturedStart(int) и похоже на результат.

Ссылки:

http://doc.qt.io/qt-5/qregularexpression.html#match

http://doc.qt.io/qt-5/qregularexpressionmatch.html

0

По вопросам рекламы [email protected]