为什么以下代码不匹配? 表达并不困难,在线正则表达式测试人员也说它应该工作。我做错了吗?
QRegExp rex("(.*?)(\\d+\\.\\d+)_(\\d+\\.\\d+).*?");
QString fileName("tile_10.0000_47.3100_0.1_.dat");
if (rex.indexIn(fileName)>=0) {
// ...
}
答案 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);