Я могу найти предыдущее совпадение с этим, но то, что я не могу сделать, это захватить длину совпадающей строки:
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
Заранее спасибо.
Обратите внимание, что в 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, но похоже, что они могли бы.
Это можно сделать с помощью QRegularExpression. Просто используйте метод
QRegularExpressionMatch QRegularExpression::match(const QString &subject, int offset = 0, MatchType matchType = NormalMatch, MatchOptions matchOptions = NoMatchOption) const
а потом вызывать методы capturedLen(int)
, capturedStart(int)
и похоже на результат.
Ссылки: