Qt正则表达式从第一个匹配项的第一个到最后一个匹配项的结尾进行选择

Qt Regular Expression selects from first of first match to end of last match

我正在使用 QRegExp 获取文件中的一些目录。 它们都以 "R:/ and finish with .c" 开头。所以我使用了 "R:/(.*).c" 正则表达式语句。

但它有 1 个匹配以下文本:

正文:

mov       f1, dsa
lis       r9, sdefwf "R:/frori.c"
addi      r3, r9, cwrfg "R:/DWors.c"
li        r4, 0*uy
dfr       R:/DWors.c
dew       d2, fref

匹配的文本:

frori.c"
addi      r3, r9, cwrfg "R:/DWors.c"
li        r4, 0*uy
dfr       R:/DWors

匹配案例从文本的第一个 R: 开始到文本的最后一个 .c 结束,但我需要检测 3 个匹配项这个例子。

我搜索了答案,找到 ? for .*;类似于 "R:/(. *?).c" 的语句必须为我的示例生成结果。(不匹配)

我想要一个在我的文本中找到 3 个匹配项的正则表达式语句。

---------------------------------------- ---------------------------------------------- ------------------

更新: 也许我在使用 QRegExp 函数时出错了。

这是我的代码:

QString fileName = QFileDialog::getOpenFileName(this, tr("Open Text file"), "", tr("All Files (*.*)"));

QFile file(fileName);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
   return;

QString str;
QString dir;

while (!file.atEnd()) {
   str = file.readAll();
}

QRegExp rx("R:(.*)\.c");

int pos = 0;

while ((pos = rx.indexIn(str, pos)) != -1) {
       dir.append(rx.cap(1));
       dir.append('\n');
       pos += rx.matchedLength();
   }

qDebug() << dir;

使用否定字符class。

"R:/[^.]*[.]c"

您可以使用这个正则表达式: R:.*\.c

Demo

* 运算符在 Qt Regexp 中通常是贪心的。您可以通过调用 setMinimal(true)

来更改此设置

贪婪正则表达式尝试尽可能多地消耗,因此表现得与您所经历的完全一样。最小正则表达式尝试尽可能少地匹配。这应该可以解决您的问题,因为匹配将停止在 c 字符