如何使用QRegExp跨行匹配示例代码中的首尾引号?
解决QRegExp匹配包含内部引号的首尾引号问题
嘿,我明白你的问题了——原来的正则表达式"([^"]*)"只能匹配没有嵌套/内部引号的成对引号,遇到字符串里的内部引号就会提前终止匹配,所以只能抓到"Test"而不是最外层的那对引号。
要匹配包含内部成对引号的最外层引号,我们需要调整正则表达式,让它能够跳过那些内部的成对引号,直到找到真正的结尾引号。试试这个正则:
"((?:[^"]|"[^"]*")*)"
正则拆解:
":匹配开头的双引号(?:...):这是一个非捕获组,用来分组但不单独捕获内容,里面包含两种可选匹配规则:[^"]:匹配任意非双引号的字符"[^"]*":匹配一对完整的内部引号(开头引号+非引号内容+结尾引号)
*:让上面的非捕获组重复任意次数,这样就能覆盖所有内部的成对引号和普通内容":匹配结尾的双引号
Qt代码示例:
#include <QCoreApplication> #include <QRegExp> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString input = "echo \"#!/bin/bash VAR=\"Test\" Script content \" > $SCRIPT"; // 初始化正则表达式 QRegExp regex("\"((?:[^\"]|\"[^\"]*\")*)\""); // 如果需要匹配包含换行符的多行字符串,加上这个设置: // regex.setPatternOptions(QRegExp::DotMatchesEverything); int pos = 0; while ((pos = regex.indexIn(input, pos)) != -1) { qDebug() << "匹配到的引号内内容:" << regex.cap(1); pos += regex.matchedLength(); } return a.exec(); }
这段代码会输出最外层引号包裹的内容:#!/bin/bash VAR="Test" Script content
注意事项:
- 这个正则假设内部的引号都是成对出现的,如果有未闭合的引号,它会匹配到下一个有效引号为止(这通常符合大多数场景的需求)
- 如果你的目标字符串包含换行符,记得开启
QRegExp::DotMatchesEverything选项,让正则中的通配符可以匹配换行符
内容的提问来源于stack exchange,提问作者eivindmu
相关产品推荐
相关产品推荐

