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

时间:2017-01-26 13:44:31

标签: regex qregexp

为什么以下代码不匹配? 表达并不困难,在线正则表达式测试人员也说它应该工作。我做错了吗?

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

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

3 个答案:

答案 0 :(得分:2)

QRegExp不支持延迟量词,因此*?在这里不起作用。此外,模式末尾的.*?与任何文本都不匹配,可以安全删除。

我建议将第一个.*?替换为([^_]*)_模式( 0+字符除_以及_之后)替换为转到第一个digits.digits文字:

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

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

答案 1 :(得分:0)

一个可能的变化可能是:

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

这对你的例子非常严格。

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

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

希望有所帮助

答案 2 :(得分:0)

您还可以使用QRegExp.setMinimal()更改量词行为,以使其在默认情况下非贪婪,并对您的模式稍作更改:

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