为什么这个正则表达式不匹配?

why does this regex does not match?

为什么下面的代码不匹配? 该表达式并不难,在线正则表达式测试器也指出它应该可以工作。我是不是在转义上做错了什么?

  QRegExp rex("(.*?)(\d+\.\d+)_(\d+\.\d+).*?");
  QString fileName("tile_10.0000_47.3100_0.1_.dat");

  if (rex.indexIn(fileName)>=0) {
    // ...
  }

一个可能的变化可能是:

(.*?)(\d+\.\d+)_(\d+\.\d+)_(\d+\.\d+)_\..*

这对你的例子非常严格。

这里接受任何数字序列后跟下划线直到文件扩展名。

(.*?)((\d+\.\d+)_+)\..*

希望对您有所帮助

QRegExp 不支持惰性量词,所以 *? 在这里不起作用。此外,模式末尾的 .*? 不匹配任何文本,可以安全地删除它。

我建议将第一个 .*? 替换为 ([^_]*)_ 模式(0+ 个除 _ 之外的字符和紧随其后的 _) 到达第一个 digits.digits 文本:

rex("([^_]*)_(\d+\.\d+)_(\d+\.\d+)")

或者,如果您需要匹配字符串开头的数据,请在模式前加上 ^(字符串开头)。

您还可以使用 QRegExp.setMinimal() 更改量词行为,使它们默认为 non-greedy 并稍微更改您的模式:

QRegExp rex("(.*)(\d+\.\d+)_(\d+\.\d+)(\D.*|$)");
rex.setMinimal(true);