为什么这个正则表达式不匹配?
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);
为什么下面的代码不匹配? 该表达式并不难,在线正则表达式测试器也指出它应该可以工作。我是不是在转义上做错了什么?
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);