QRegularExpression:不能使部分匹配可选

时间:2015-12-09 15:03:42

标签: regex qt

给出以下字符串:

  

data:image / png; base64,iVBORw0KGgoAAAANSUhEUgAAAF8h / ls5JiSNQB5gAAAABJRU5ErkJggg =="这是一个工具提示"

应该代表图像的数据网址,我应该提取它的所有部分,以便我为它制作一个RegEx:

str =" (data:(\w+)/(\w+);base64,)(.*)(\"([\w*|\s*]*)\")"

它与以下代码一样:

QRegularExpressionMatch match = regex.match(str);
for(int i = 0; i <= match.lastCapturedIndex(); ++i )
    ui->outputBrowser->append(QString::number(i) + ": " + match.captured(i));

我可以看到:

0: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF8h/ls5JiSNQB5gAAAABJRU5ErkJggg== "this is a tooltip"
1: data:image/png;base64,
2: image
3: png
4: iVBORw0KGgoAAAANSUhEUgAAAF8h/ls5JiSNQB5gAAAABJRU5ErkJggg== 
5: "this is a tooltip"
6: this is a tooltip

但是如果我在RegEx的末尾添加?,它就不起作用了。 "this is a tooltip" - 是可选的 - 转到数据部分而不是独立部分。

str =&#34; (data:(\w+)/(\w+);base64,)(.*)(\"([\w*|\s*]*)\")?&#34;

输出:

0: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF8h/ls5JiSNQB5gAAAABJRU5ErkJggg== "this is a tooltip"
1: image/png;base64,
2: image
3: png
4: iVBORw0KGgoAAAANSUhEUgAAAF8h/ls5JiSNQB5gAAAABJRU5ErkJggg== "this is a tooltip"

问题出在哪里?

1 个答案:

答案 0 :(得分:1)

使用以下正则表达式:

(data:(\w+)/(\w+);base64,)([^"]*)(\"([\w\s]*)\")?
                           ^^^^^                ^

.*过于贪婪并且匹配每个字符,但是换行符,出现0次或更多次。为了能够使最后一个组成为可选组,您需要限制此子模式。您可以使用[^"]*否定字符类来完成此操作。

请参阅regex demo

另请注意,[\w*|\s*]匹配字母数字或下划线(\w),空白(\s),|*的单个字符。在字符类中,|*是文字管道和星号符号。