【问题标题】:Qt - RegExp not working properlyQt - 正则表达式无法正常工作
【发布时间】:2014-09-22 16:58:27
【问题描述】:

我正在使用 Qt 5.2.1。我需要编写一个正则表达式来查找表示具有十进制值的数字的字符串,例如它会找到 1.234 或 123.4,但不会找到 123 或类似 a1.2 的东西。我有这个正则表达式:

QRegExp r("^\\d+\.\\d+$");

但是我注意到,除了找到它应该找到的值之外,它还会找到所有数字且 >= 3 位但没有小数的任何值,例如12345,以及除中间一个字符外的所有数字的值,例如 12:345。我很确定问题出在正则表达式试图使用“。”代表任何字符,但我认为使用“。”应该让它识别实际的“。”而是字符。如果有人看到我做错了什么,我将不胜感激。谢谢!

【问题讨论】:

    标签: c++ regex qt


    【解决方案1】:

    试试这个:

    QString txt = ui->textEdit->toPlainText();
    QRegExp r("[0-9]+\\.[0-9]+");
    QRegExp r("^\\d+\\.\\d+$");//with this \\. works properly too (same output)
    
    if(txt.contains(r))
    {
        qDebug() << txt << "contains double" ;
    }
    else
        qDebug() << txt << " not contains double" ;
    

    在我的电脑上,它会捕获带小数点的数字并忽略其他数字。

    输出:

    "45:3"  not contains double 
    "45.323" contains double 
    "12345"  not contains double 
    "12:345"  not contains double 
    

    【讨论】:

    • 非常感谢您的回答,我将其更改为"\\.",现在可以使用了。但是,您能否解释一下为什么有效?如果使用反斜杠转义特殊字符,在我看来 "\." 应该转义特殊字符 "." 并只查找句点字符,而 "\\." 将转义 "\" 同时保持 "." 特殊,所以它会找到"\" 后跟任何字符。为什么它是第二种方式而不是第一种方式?
    • @thnkwthprtls 是的,"\\" 转义 "\" 所以“\\.”被转义"\"plus. == \. 看来您使用的是简单的点。正如文档所说:. (dot) Matches any character (including newline). 我玩你的第一个正则表达式,我得到 45:345b345\n3 返回 true,这意味着它是 dot,而不是你所定义的。