1

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

int pos = 0;

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

我可以使用 捕获匹配的长度,但在nor类中QRegularExpressionMatch找不到任何会改变搜索方向的标志/选项。(我并不是要反转模式,而是在字符串中的某个位置之前找到第一个匹配项。)QRegularExpressionQRegularExpressionMatch

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

    hello world hello
            ^
          start (somewhere in the middle)

这应该是匹配的部分:

   hello world hello
   ^   ^
start  end

先感谢您。

4

2 回答 2

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 来做这件事,但看起来他们可能忘记了。

于 2015-04-27T18:07:59.413 回答
1

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

于 2016-10-24T00:35:15.833 回答