Regex 提取与特定格式匹配的字符串

Regex 提取与特定格式匹配的字符串,regex,string,qt,qregexp,qregularexpression,Regex,String,Qt,Qregexp,Qregularexpression,给定一个QString,我想从主字符串输入中提取一个子字符串 e、 g.我有一个Q字符串,读到如下内容: \\\\?\\Volume{db41aa6a-c0b8-11e9-bc8a-806e6f6e6963}\\ string.replace("{", "").replace("}", "").replace("\\", "").replace("?", "").replace("Volume", ""); 我需要使用与正则表达式格式(\w){8}([-](\w){4}){3}[-](\w)

给定一个QString,我想从主字符串输入中提取一个子字符串

e、 g.我有一个Q字符串,读到如下内容:

\\\\?\\Volume{db41aa6a-c0b8-11e9-bc8a-806e6f6e6963}\\
string.replace("{", "").replace("}", "").replace("\\", "").replace("?", "").replace("Volume", "");
我需要使用与正则表达式格式
(\w){8}([-](\w){4}){3}[-](\w){12}
匹配的模板/格式提取字符串(如果存在该格式的字符串),如下所示:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
它应该会回来

db41aa6a-c0b8-11e9-bc8a-806e6f6e6963
如果找到,则为空
QString

目前,我可以通过以下方式实现这一目标:

\\\\?\\Volume{db41aa6a-c0b8-11e9-bc8a-806e6f6e6963}\\
string.replace("{", "").replace("}", "").replace("\\", "").replace("?", "").replace("Volume", "");
但这是冗长而低效的,而且是根据特定的要求定制的

是否有一个通用函数使我能够使用正则表达式格式或其他格式提取子字符串

更新

为了在@Emma的回答之后更清楚,我想要例如
QString::extract((\w){8}([-](\w){4}{3}[-](\w){12}”)
,它返回
db41aa6a-c0b8-11e9-bc8a-806e6e6f6e6963

Volume{(\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b)}
或者只是

\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b
一场完整的比赛可能会更接近


如果您希望简化/更新/探索表达式,将在的右上面板中进行解释。如果您感兴趣,可以查看匹配步骤或在中修改它们。调试器演示了如何逐步使用一些示例输入字符串并执行匹配过程


正则表达式电路 可视化正则表达式:

来源
这里有一系列方法可以提取问题中提出的字符串的一部分。我不知道有多少字符串格式是固定的而不是可变的,所以可能不是所有这些示例都是实用的。此外,下面的一些示例使用的类效率更高,但在任何引用都处于活动状态时,必须具有原始字符串(被引用的字符串)(请参见文档中的警告)

const QString str(“\\\\?\\Volume{db41aa6a-c0b8-11e9-bc8a-806e6f6e6963}\”;
//将str视为由“{”和“}”字符分隔的列表。
const QString sectResult=str.section('{',1,1).section('}',0,0);//=“db41aa6a-c0b8-11e9-bc8a-806e6f6e6963”
const QString sectRxResult=str.section(QRegExp(“\\{124;\\}”),1,1);//=“db41aa6a-c0b8-11e9-bc8a-806e6f6e6963”
//使用QStringRef的示例,但这也可能只是返回QString副本的QString::split()。
const QVector splitRef=str.splitRef(QRegExp(“\\{124;\\}”);
常量QStringRef splitRefResult=splitRef.value(1);//=“db41aa6a-c0b8-11e9-bc8a-806e6f6e6963”
//使用正则表达式查找/提取匹配字符串
常量QRegularExpression rx(\\w{8}(?:-(\\w){4}{3}-\\w{12}”);//匹配UUID字符串
常量QRegularExpressionMatch=rx.match(str);
常量QString rxResultStr=match.captured(0);//=“db41aa6a-c0b8-11e9-bc8a-806e6f6e6963”
常量QStringRef rxResultRef=match.capturedRef(0);//=“db41aa6a-c0b8-11e9-bc8a-806e6f6e6963”
常量QRegularExpression rx2(“.+\\{([^{\}]+)\}.+”)//捕获{}括号内的任何内容
常量qregularexpressionmatch2=rx2.match(str);
常量QString rx2ResultStr=match2.捕获(1);//=“db41aa6a-c0b8-11e9-bc8a-806e6f6e6963”
//为replace制作一个副本,以便我们对原始字符串的引用保持有效。
常量QString replaceResult=QString(str).replace(rx2,“\\1”);//=“db41aa6a-c0b8-11e9-bc8a-806e6f6e6963”

qDebug()正则表达式很好,我对正则表达式没有问题。我正在寻找一种从另一个字符串中提取与正则表达式匹配的子字符串的有效方法。