给出以下字符串:
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"
问题出在哪里?
答案 0 :(得分:1)
使用以下正则表达式:
(data:(\w+)/(\w+);base64,)([^"]*)(\"([\w\s]*)\")?
^^^^^ ^
.*
过于贪婪并且匹配每个字符,但是换行符,出现0次或更多次。为了能够使最后一个组成为可选组,您需要限制此子模式。您可以使用[^"]*
否定字符类来完成此操作。
请参阅regex demo
另请注意,[\w*|\s*]
匹配字母数字或下划线(\w
),空白(\s
),|
或*
的单个字符。在字符类中,|
和*
是文字管道和星号符号。