gpt4 book ai didi

c++ - 使用 QRegularExpression 将嵌套的捕获组与量词匹配

转载 作者:行者123 更新时间:2023-11-30 04:47:52 25 4
gpt4 key购买 nike

我正在尝试使用 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 和字符串文字上的特定正则表达式进行迭代?

最佳答案

This expression可能会帮助您简单地捕获这些属性,并且它不受左右限制:

([A-z]+)(=\x22)([A-z]+)(\x22)

enter image description here

此图显示了表达式的工作方式,您可以在这个 link 中可视化其他表达式,如果你想知道:

enter image description here


如果您想为其添加额外的边界,您可能想要这样做,您可以进一步扩展它,也许可以扩展到某些东西 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}`);
});
}

关于c++ - 使用 QRegularExpression 将嵌套的捕获组与量词匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56040034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com