QT C ++ QRegularExpression多个匹配项

Sea*_*ace 4 c++ regex qt

我想通过使用正则表达式从QString(.html)中提取信息。我明确地想使用Regex(无解析器解决方案)和QRegularExpression类(出于多种原因,例如:Reasons)。

为简化起见,这里是等效问题任务。

构造的源字符串:

<foo><bar s>INFO1.1</bar> </ qux> <peter></peter><bar e>INFO1.2
</bar><fred></ senseless></fred></ xx><lol></lol></foo><bar s>INFO2.1</bar>
</ nothing><endlessSenselessTags></endlessSenselessTags><rofl>
<bar e>INFO2.2</bar></rofl>
Run Code Online (Sandbox Code Playgroud)

*注意:*可能会有更多或更少的INFO和其他无意义标签。(例如6条信息)

通缉:

Info1.1和Info1.2以及Info2.1和Info2.2(例如,列表中)

尝试

1。

QRegularExpression reA(".*<bar [es]>(.*)</bar>.*", QRegularExpression::DotMatchesEverythingOption);
Run Code Online (Sandbox Code Playgroud)

->

INFOa</bar> </ qux> <peter></peter><bar e>INFOb
    </bar><fred></ senseless></fred></ xx><lol></lol></foo><bar s>INFOc</bar>
    </ nothing><endlessSenselessTags></endlessSenselessTags><rofl>
    <bar e>INFOd
Run Code Online (Sandbox Code Playgroud)

2。

QRegularExpression reA("(.*<bar [es]>(.*)</bar>.*)*", QRegularExpression::DotMatchesEverythingOption);
Run Code Online (Sandbox Code Playgroud)

->无意义

问题: 正则表达式始终与整个String相关。<bar s>INFO</bar><bar s>INFO</bar> 会选择第一个<bar s>,最后一个和</bar>。通缉是第一

使用QRegExp似乎有解决方案,但是我想使用QRegularExpression做到这一点。

Sal*_*nzo 5

也许你可以尝试一下

QRegularExpression reA("(<bar [se]>[^<]+</bar>)");

QRegularExpressionMatchIterator i = reA.globalMatch(input);
while (i.hasNext()) {
    QRegularExpressionMatch match = i.next();
    if (match.hasMatch()) {
         qDebug() << match.captured(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

这给了我这个输出

"<bar s>INFO1.1</bar>" 
"<bar e>INFO1.2
</bar>" 
"<bar s>INFO2.1</bar>" 
"<bar e>INFO2.2</bar>"  
Run Code Online (Sandbox Code Playgroud)

而这个表情

QRegularExpression reA("((?<=<bar [se]>)((?!</bar>).)+(?=</bar>))",
                       QRegularExpression::DotMatchesEverythingOption);
Run Code Online (Sandbox Code Playgroud)

用这个输入

<foo><bar s>INFO1</lol>.1</bar> </ qux> <peter></peter><bar e>INFO1.2
</bar><fred></ senseless></fred></ xx><lol></lol></foo><bar s>INFO2.1</bar>
</ nothing><endlessSenselessTags></endlessSenselessTags><rofl>
<bar e>INFO2.2</bar></rofl>
Run Code Online (Sandbox Code Playgroud)

给我输出

"INFO1</lol>.1" 
"INFO1.2
" 
"INFO2.1" 
"INFO2.2"
Run Code Online (Sandbox Code Playgroud)