我想捕获两次出现的单词SAT
之间的字符串,但不包含SAT
。到目前为止我找到了这个,这是行不通的
QLatin1String(".*SAT([^(SAT)]*)SAT.*")
我担心[^(SAT)]*
没有做我想做的事,就是找到一个不是SAT
字的字符串。或者我捕捉的方式也不好:
QRegExp rx(pat);
int p = 0;
QString cap = QString::null;
if((p = rx.indexIn(str, p)) != -1)
cap = rx.cap(1).trimmed();
答案 0 :(得分:1)
您可以使用延迟量词'?'。
(?<=SAT).*?(?=SAT)
基本上,您搜索SAT,然后搜索尽可能少的符号,直到找到第二个SAT。因此,您在捕获的字符串中不会有SAT。
答案 1 :(得分:1)
试试这个:
(?<=SAT)(.+?)(?=SAT)
它实际上做的是SAT
。{/ p>后面和后方
如果您想测试每个字符串并使用整个字符串作为示例,那么只需使用此修改后的版本:^(?<=SAT)(.+?)(?=SAT)$
顺便说一句,只是尝试了这个(SAT([^(SAT)]+)SAT
),它似乎也在起作用。这是一个演示:http://regex101.com/r/fJ4gO5
答案 2 :(得分:0)
我有这个:
首先,我使用此
首次出现SAT
后捕获整个字符串
const QString pat = QLatin1String("SAT(.*)");
QRegExp rx(pat);
int p = 0;
QString cap = QString::null;
if((p = rx.indexIn(str, p)) != -1)
cap = rx.cap(1).trimmed();
然后,我在结果SAT
中查找cap
的位置。如果我确实可以再次找到此SAT
,我会在cap
之前选择SAT
中的字符:
QRegExp rxrev(QLatin1String("SAT"));
if((p = rxrev.indexIn(cap, 0)) != -1)
cap = cap.mid(0,p);
它的优势在于它只使用最简单的QRegEx方法并且有效。