我们在这一点上都被难住了:
QRegExp kcc_stationing("(-)?(\\d+)\\.(\\d+)[^a-zA-Z]");
QString str;
if (kcc_stationing.indexIn(description) > -1)
{
str = kcc_stationing.cap(1) + kcc_stationing.cap(2) + "." + kcc_stationing.cap(3);
qDebug() << kcc_stationing.cap(1);
qDebug() << kcc_stationing.cap(2);
qDebug() << kcc_stationing.cap(3);
qDebug() << "Description: " << description;
qDebug() << "Returned Stationing string: " << str;
}在“1082.006”上运行以下代码:

注意遗漏的"6“
经过一些盲目的猜测,我们删除了[^a-zA-Z]并得到了正确的答案。我们最初添加了这一点,这样我们就会拒绝任何直接附加了其他字符而没有空格的数字。
例如: 10.05D应该被拒绝。
谁能解释一下为什么这个额外的部分会导致我们失去最后的"6"?
发布于 2016-08-02 01:42:43
[^a-zA-Z]是一个字符类。字符类匹配一个字符。它不会匹配字符串的末尾,因为那里没有字符。
为了得到这个结果,引擎将所有的数字与\\d+进行匹配,包括最后一个。然后,它将需要回溯,以便满足最后一个字符类。
我认为您希望允许零宽度匹配(特别是当它是字符串的末尾时)。在您的例子中,最容易使用的是:
(-)?(\\d+)\\.(\\d+)([^a-zA-Z]|$)或者,如果Qt支持非捕获组:
(-)?(\\d+)\\.(\\d+)(?:[^a-zA-Z]|$)请注意,我还推荐使用[.]而不是\\.,因为我觉得它提高了可读性。
https://stackoverflow.com/questions/38704724
复制相似问题