QRegExp:个人量词不能不贪心,但有什么好的选择呢?

时间:2012-12-07 08:12:53

标签: qt pcre regex-greedy non-greedy qregexp

我正在尝试编写将_my_ending结尾添加到文件名的代码,并且不会更改文件扩展名。

我需要得到的例子:

"test.bmp"            -> "test_my_ending.bmp"
"test.foo.bar.bmp"    -> "test.foo.bar_my_ending.bmp"
"test"                -> "test_my_ending"

我在PCRE有一些经验,这是使用它的琐碎任务。由于缺乏Qt的经验,我最初编写了以下代码:

QString new_string = old_string.replace(
      QRegExp("^(.+?)(\\.[^.]+)?$"),
      "\\1_my_ending\\2"
      );

此代码不起作用(根本不匹配),然后我在docs中找到了

  

非贪婪匹配不能应用于单个量词,但可以应用于模式中的所有量词

如您所见,在我的正则表达式中,我尝试通过在其后添加+来减少第一个量词?的贪婪。 QRegExp

不支持此功能

这对我来说真的很令人失望,因此,我必须编写以下丑陋却正常的代码:

//-- write regexp that matches only filenames with extension
QRegExp r = QRegExp("^(.+)(\\.[^.]+)$");
r.setMinimal(true);

QString new_string;

if (old_string.contains(r)){
   //-- filename contains extension, so, insert ending just before it
   new_string = old_string.replace(r, "\\1_my_ending\\2");
} else {
   //-- filename does not contain extension, so, just append ending
   new_string = old_string + time_add;
}

但是有更好的解决方案吗?我喜欢Qt,但我看到的一些东西似乎令人沮丧。

1 个答案:

答案 0 :(得分:1)

如何使用QFileInfo?这比你的“丑陋”代码要短:

QFileInfo fi(old_string);
QString new_string = fi.completeBaseName() + "_my_ending" 
    + (fi.suffix().isEmpty() ? "" : ".") + fi.suffix();