使用正則表達式限制QLineEdit不能輸入大於某個整數

使用正則表達式限制QLineEdit不能輸入大於某個整數,即:使用正則表達式,匹配不大於某個整數

舉例:匹配不大於4567

* 原理分析:

  • 匹配不大於4567這個數,所以第一個想到的是只要小於4567就都匹配,小於4567不能直接匹配,但是可以匹配小於四位數的整數,也就是說只要是三位數就都可以匹配,那大於四位數的當然是完全不匹配了,正則表達式可以寫做:
[0-9]
[0-9][0-9]
[0-9][0-9][0-9]
  • 現在就只剩下四位數,四位數就需要細分了,首先從它的千位也就是第一位看起,不大於4567,那麼第一位當然是不能大於4,所以只要第一位不大於4 的整數就都匹配,正則表達式寫做:
[0-3][0-9][0-9][0-9]
  • 四位數的第一位解決了,那麼就是第二位數了,第二位數不大於5,但是前提是前面的第一位數正好是4,所以第一位正好是4、第二位不大於5,後兩位無論是什麼都匹配,正則表達式寫做:
4[0-4][0-9][0-9]
  • 以此類推,第三位不大於6,第四位不大於7,正則表達式分別寫做:
45[0-6][0-9]
456[0-7]
  • 最後一種情況:正好是4567,正則表達式直接寫做:
4567

組裝

現有多個匹配條件,需要使用符號|連接多個條件,所以綜上條件,正則表達式寫做:

[0-9]|[0-9][0-9]|[0-9][0-9][0-9]|[0-3][0-9][0-9][0-9]|4[0-4][0-9][0-9]|45[0-6][0-9]|456[0-7]|4567

可以看得出,上面的寫法非常冗餘,現在將上面的寫法稍做簡化,寫法如下:

\d|\d{0,2}|\d{0,3}|[0-3]\d{0,3}|4[0-4]\d{0,2}|45[0-6]\d|456[0-7]|4567

QLineEdit限制輸入程式碼

/* ^ 和 $ 表示正則表達式的起始和截止位置
 * \d 匹配任意數字
 * {0,2} 重複0-2次,包括0和2
 * 為避免\d被轉義,需要先轉義\,所以是兩個\
 */
QRegExp rx("^\\d|\\d{0,2}|\\d{0,3}|[0-3]\\d{0,3}|4[0-4]\\d{0,2}|45[0-6]\\d|456[0-7]|4567$");  // 匹配小於4567

QLineEdit * edit = new QLineEdit(this);
edit->setValidator(new QRegExpValidator(rx,this));