QRegularExpression - 向后查找与捕获长度的匹配
QRegularExpression - find match with captured length backwards
我可以找到以前的匹配项,但我不能做的是捕获匹配字符串的长度:
int pos = 0;
if((pos = text.lastIndexOf(QRegularExpression(pattern), cursorPosition - 1)) != -1))
cout << "Match at position: " << pos << endl;
我可以捕获与 QRegularExpressionMatch
匹配的长度,但我在 QRegularExpression
和 QRegularExpressionMatch
类 中找不到任何 flag/option会改变搜索的方向。 (我不是要颠倒模式,而是要找到字符串中某个位置之前的第一个匹配项。)
示例(我想找到非偶数正则表达式 "hello"
):
hello world hello
^
start (somewhere in the middle)
这应该是匹配的部分:
hello world hello
^ ^
start end
提前致谢。
请注意,在 Qt5 QRegExp != QRegularExpression 中,我对 QRegExp 更加熟悉。也就是说,我看不到用 QRegularExpression 或 QRegularExpression::match().
做你想做的事情的方法
我会使用 QString::indexOf to search forwards and 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 做到这一点,但看起来他们可能忘记了。
可以用QRegularExpression来完成。只需使用方法
QRegularExpressionMatch QRegularExpression::match(const QString &subject, int offset = 0, MatchType matchType = NormalMatch, MatchOptions matchOptions = NoMatchOption) const
及以后调用方法 capturedLen(int)
、capturedStart(int)
和类似的结果。
链接:
我可以找到以前的匹配项,但我不能做的是捕获匹配字符串的长度:
int pos = 0;
if((pos = text.lastIndexOf(QRegularExpression(pattern), cursorPosition - 1)) != -1))
cout << "Match at position: " << pos << endl;
我可以捕获与 QRegularExpressionMatch
匹配的长度,但我在 QRegularExpression
和 QRegularExpressionMatch
类 中找不到任何 flag/option会改变搜索的方向。 (我不是要颠倒模式,而是要找到字符串中某个位置之前的第一个匹配项。)
示例(我想找到非偶数正则表达式 "hello"
):
hello world hello
^
start (somewhere in the middle)
这应该是匹配的部分:
hello world hello
^ ^
start end
提前致谢。
请注意,在 Qt5 QRegExp != QRegularExpression 中,我对 QRegExp 更加熟悉。也就是说,我看不到用 QRegularExpression 或 QRegularExpression::match().
做你想做的事情的方法我会使用 QString::indexOf to search forwards and 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 做到这一点,但看起来他们可能忘记了。
可以用QRegularExpression来完成。只需使用方法
QRegularExpressionMatch QRegularExpression::match(const QString &subject, int offset = 0, MatchType matchType = NormalMatch, MatchOptions matchOptions = NoMatchOption) const
及以后调用方法 capturedLen(int)
、capturedStart(int)
和类似的结果。
链接: