• Qt——正则表达式


    在项目中经常会遇到对字符串进行操作的情况,我们可以直接使用QString的一些函数,但QT提供了一个更加强大的类——QRegExp,使用正则表达式来操作字符串。

    先说说我最近遇到的几个问题:

    1.对输入框LineEdit中的输入内容加以限制,比如只能输入数字,并且最多5位数(因为int类型不限制位数会导致溢出问题);

    2.检查输入是否正确,比如判断是否是1-9999之间的数;

    3.获取一个字符串中的一段内容,比如获取2015-11-20中的2015。

    为了解决这些问题,下面先看看正则表达式的基本知识。

    一、基本知识

    正则表达式(Regular Expression,通常简写为RegExp、RE等),预先定义一些字符或字符的组合,用于匹配文本中的一段字符串。下面是它的一些用途——

    1.验证

    判断字符串是否符合某个标准,比如“是一个整数”或者“没有空格”。

    2.搜索

    正则表达式提供了比普通字符串匹配更为强大的匹配方式,比如匹配下面的词语:mail, letter, correspondence,但是不包括email, mailman, letterbox等等。

    3.查找并替换

    正则表达式能够用一个不同的字符串,替换所有出现另一个字符串的地方,比如用&替换&,如果原先&后面已经有了amp;那么不替换。

    4.分割字符串

    比如,根据tab来分割字符串。

    使用正则表达式首先需要了解一些符号的作用,比如d用来匹配数字,下面结合一些例子说明。

    注意:C++编译器会对反斜杠进行转换,要想在正则表达式中包括一个,需要输入两次,例如\s。要想匹配反斜杠本身,需要输入4次,比如\\。

    二、在QT中的用法

    void QLineEdit::setValidator(const QValidator * v)

    如果输入与正则表达式相匹配,则返回Acceptable;如果部分匹配,则返回Intermediate(部分匹配,意思是如果给它增加额外的字符则能够匹配正则表达式);如果不匹配则返回Invalid。

    enum QValidator::State

    这个枚举类型说明了被验证的字符串是哪种类型。

    QValidator::Invalid:值为0,表示字符串完全不匹配;

    QValidator::Intermediate:值为1,表示部分匹配;

    QValidator::Acceptable:值为2,表示完全匹配。

    // integers 1 to 9999
    QRegExp rx("[1-9]\d{0,3}");
    // the validator treats the regexp as "^[1-9]\d{0,3}$"
    QRegExpValidator v(rx, 0);
    QString s;
    int pos = 0;
      
    s = "0";     v.validate(s, pos);    // returns Invalid
    s = "12345"; v.validate(s, pos);    // returns Invalid
    s = "1";     v.validate(s, pos);    // returns Acceptable
      
    rx.setPattern("\S+");            // one or more non-whitespace characters
    v.setRegExp(rx);
    s = "myfile.txt";  v.validate(s, pos); // Returns Acceptable
    s = "my file.txt"; v.validate(s, pos); // Returns Invalid
      
    // A, B or C followed by exactly five digits followed by W, X, Y or Z
    rx.setPattern("[A-C]\d{5}[W-Z]");
    v.setRegExp(rx);
    s = "a12345Z"; v.validate(s, pos);        // Returns Invalid
    s = "A12345Z"; v.validate(s, pos);        // Returns Acceptable
    s = "B12";     v.validate(s, pos);        // Returns Intermediate
      
    // match most 'readme' files
    rx.setPattern("read\S?me(.(txt|asc|1st))?");
    rx.setCaseSensitive(false);
    v.setRegExp(rx);
    s = "readme";      v.validate(s, pos); // Returns Acceptable
    s = "README.1ST";  v.validate(s, pos); // Returns Acceptable
    s = "read me.txt"; v.validate(s, pos); // Returns Invalid
    s = "readm";       v.validate(s, pos); // Returns Intermediate

    看上面的表达式,开头的^表示必须以[0-9]+开头,结尾的$表示必须以字母c结尾,如果输入的是123a,则返回QValidator::Intermediate,表示部分匹配,如果输入的是233abc,则完全匹配。

    3.截取字符串

    QString QRegExp::cap(int nth = 0) const

    这个函数返回被第n个子表达式捕获的文本,整个匹配拥有下标0,带括号的子表达式下标从1开始。

    QRegExp rxlen("(\d+)(?:\s*)(cm|inch)");
    int pos = rxlen.indexIn("Length: 189cm");
    if (pos > -1) {
        QString value = rxlen.cap(1); // "189"
        QString unit = rxlen.cap(2);  // "cm"
        // ...
    }

    关于正则表达式的知识还有很多,比如结合QString的replace、split等函数使用,更多用法可以参考Qt Assistant。

  • 相关阅读:
    Mysql多表关系
    Linux权限
    Linux安装python环境脚本
    ZJNU 2136
    ZJNU 2135
    ZJNU 2133
    ZJNU 1699
    ZJNU 1542
    ZJNU 1538
    ZJNU 1535
  • 原文地址:https://www.cnblogs.com/wanghuixi/p/9540694.html
Copyright © 2020-2023  润新知