You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:53:16