我正在尝试使用QRegularExpression获取不同捕获组中xml标记的所有属性。我使用与标签匹配的正则表达式,并设法获取包含属性值的捕获组,但使用量词,只能得到最后一个。
我使用此正则表达式:
<[a-z]+(?: [a-z]+=("[^"]*"))*>
我想使用此文本获得“ a”和“ b”:
<p a="a" b="b">
代码如下:
const QString text { "<p a=\"a\" b=\"b\">" };
const QRegularExpression pattern { "<[a-z]+(?: [a-z]+=(\"[^\"]*\"))*>" };
QRegularExpressionMatchIterator it = pattern.globalMatch(text);
while (it.hasNext())
{
const QRegularExpressionMatch match = it.next();
qDebug() << "Match with" << match.lastCapturedIndex() + 1 << "captured groups";
for (int i { 0 }; i <= match.lastCapturedIndex(); ++i)
qDebug() << match.captured(i);
}
输出:
Match with 2 captured groups
"<p a=\"a\" b=\"b\">"
"\"b\""
是否可以使用量词*
获得多个捕获组,或者让我使用QRegularExpressionMatchIterator
来对字符串文字使用特定的正则表达式进行迭代?
答案 0 :(得分:1)
This expression可能会帮助您简单地捕获这些属性,并且不受左右限制:
([A-z]+)(=\x22)([A-z]+)(\x22)
此图显示了表达式的工作方式,如果您想知道,您可以在此link中可视化其他表达式:
如果您想为其添加其他边界,则可以进一步扩展它,甚至可以扩展到similar to:
(?:^<p )?([A-z]+)(=\x22)([A-z]+)(\x22)
const regex = /(?:^<p )?([A-z]+)(=\x22)([A-z]+)(\x22)/gm;
const str = `<p attributeA="foo" attributeB="bar" attributeC="baz" attributeD="qux"></p>`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}