QRegularExpression - 向后找到捕获长度的匹配

时间:2015-04-27 16:08:59

标签: c++ regex qt qt5 qregularexpression

我可以找到以前的匹配,但我不能做的是捕获匹配字符串的长度:

Where

我可以使用int pos = 0; if((pos = text.lastIndexOf(QRegularExpression(pattern), cursorPosition - 1)) != -1)) cout << "Match at position: " << pos << endl; 捕获匹配的长度,但我在QRegularExpressionMatchQRegularExpression类中找不到任何会改变搜索方向的标记/选项。 (我不是要反转模式,而是在字符串中的某个位置之前找到第一个匹配。)

示例(我想找到not-even-regex QRegularExpressionMatch):

"hello"

这应该是匹配的部分:

    hello world hello
            ^
          start (somewhere in the middle)

提前谢谢。

2 个答案:

答案 0 :(得分:2)

请注意,在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似乎失败的地方。据我所知,调用QString :: lastIndexOf()QRegularExpress后没有lastMatch()来检索匹配的字符串。

但是,如果您使用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

传递给QString方法的QRegExp对象会使用捕获的字符串进行更新,然后您可以使用和操作它们。我无法想象他们忘记使用QRegularExpression做到这一点,但看起来他们可能会这样做。

答案 1 :(得分:0)

可以使用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