使用不匹配单词的正则表达式链进行捕获

时间:2014-03-07 12:49:41

标签: c++ regex qt capture

我想捕获两次出现的单词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();

3 个答案:

答案 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方法并且有效。