Qt 正则表达式简单测试

对正则表达式以前没了解过,这次用到大概看了一下,感觉挺复杂的,没怎么太懂,所以对 QRegExp 也没完全理解,就直接贴代码了:


regexp.h

  1. #ifndef REGEXP_H  
  2. #define REGEXP_H  
  3.   
  4. #include <QtGui/QDialog>  
  5. #include <QtGui/QLineEdit>  
  6. #include <QtGui/QTextEdit>  
  7. #include <QtGui/QLabel>  
  8. #include <QtGui/QPushButton>  
  9. #include <QtGui/QListWidget>  
  10. #include <QtGui/QVBoxLayout>  
  11.   
  12. class RegexpConner : public QDialog  
  13. {  
  14.     Q_OBJECT  
  15.   
  16. public:  
  17.     RegexpConner( QWidget *parent = 0, Qt::WFlags flags = 0 );  
  18.     ~RegexpConner();  
  19.   
  20. private slots:  
  21.     void    onGet   ();  
  22.   
  23. private:  
  24.     QLabel      *m_labelRegexp;  
  25.     QLabel      *m_labelText;  
  26.     QLabel      *m_labelResult;  
  27.     QLabel      *m_labelIndex;  
  28.     QLineEdit   *m_leditRegexp;  
  29.     QLineEdit   *m_leditIndex;  
  30.     QTextEdit   *m_teditText;  
  31.     QListWidget *m_listResult;  
  32.     QPushButton *m_btnGet;  
  33.     QHBoxLayout *m_hboxLayout;  
  34.     QVBoxLayout *m_vboxLayout;  
  35. };  
  36.   
  37. #endif // REGEXP_H  


regexp.cpp
  1. #include "regexp.h"  
  2.   
  3. RegexpConner::RegexpConner( QWidget *parent, Qt::WFlags flags )  
  4.     : QDialog( parent, flags )  
  5. {  
  6.     m_labelRegexp   = new QLabel( "regexp:" );  
  7.     m_labelText     = new QLabel( "text:" );  
  8.     m_labelResult   = new QLabel( "result:" );  
  9.     m_labelIndex    = new QLabel( "index:" );  
  10.     m_leditRegexp   = new QLineEdit;  
  11.     m_leditIndex    = new QLineEdit;  
  12.     m_teditText     = new QTextEdit;  
  13.     m_listResult    = new QListWidget;  
  14.     m_btnGet        = new QPushButton( "GET" );  
  15.   
  16.     m_hboxLayout    = new QHBoxLayout;  
  17.     m_hboxLayout->addWidget( m_btnGet );  
  18.     m_hboxLayout->addWidget( m_labelIndex );  
  19.     m_hboxLayout->addWidget( m_leditIndex );  
  20.   
  21.     m_vboxLayout    = new QVBoxLayout( this );  
  22.     m_vboxLayout->addWidget( m_labelText );  
  23.     m_vboxLayout->addWidget( m_teditText );  
  24.     m_vboxLayout->addWidget( m_labelRegexp );  
  25.     m_vboxLayout->addWidget( m_leditRegexp );  
  26.     m_vboxLayout->addLayout( m_hboxLayout );  
  27.     m_vboxLayout->addWidget( m_labelResult );  
  28.     m_vboxLayout->addWidget( m_listResult );  
  29.   
  30.     setFixedSize( 500, 500 );  
  31.   
  32.     connect( m_btnGet, SIGNAL(clicked()), this, SLOT(onGet()) );  
  33. }  
  34.   
  35. RegexpConner::~RegexpConner()  
  36. {  
  37. }  
  38.   
  39. void RegexpConner::onGet()  
  40. {  
  41.     m_listResult->clear();  
  42.   
  43.     QString text = m_teditText->toPlainText();  
  44.     QString exp = m_leditRegexp->text();  
  45.     if( text.isEmpty() || exp.isEmpty() )  
  46.         return;  
  47.   
  48.     int index = m_leditIndex->text().toUInt();  
  49.   
  50.     QRegExp qregexp( exp );  
  51.     int length = 0;  
  52.     int idx = qregexp.indexIn( text, 0 );  
  53.   
  54.     while( -1 != idx ) {  
  55.         int num = qregexp.numCaptures();  
  56.         QString str = qregexp.cap( index );  
  57.         if( !str.isEmpty() ) {  
  58.             QListWidgetItem *item = new QListWidgetItem( str );  
  59.             m_listResult->addItem( item );  
  60.         }  
  61.         length = qregexp.matchedLength();  
  62.         idx = qregexp.indexIn( text, idx + length );  
  63.     }  
  64. }  

main.cpp
  1. #include "regexp.h"  
  2. #include <QtGui/QApplication>  
  3. #include <QRegExp>  
  4. #include <QTextCodec>  
  5. #include <QObject>  
  6.   
  7. int main(int argc, char *argv[])  
  8. {  
  9.     QApplication a(argc, argv);  
  10.       
  11.     RegexpConner rc;  
  12.     rc.show();  
  13.   
  14.     return a.exec();  
  15. }  

以下是测试结果:








转载:http://blog.youkuaiyun.com/kusey/article/details/7383184


<think>好的,我现在需要帮助用户解决如何使用Qt中的正则表达式来判断一个字符串是否为整数。首先,我得回忆一下Qt中的正则表达式类,通常是QRegularExpression。用户可能已经有一定的Qt基础,但可能对正则表达式不太熟悉,所以需要详细解释。 首先,整数可能包括正整数、负整数和零。所以正则表达式需要覆盖这些情况。接下来,我需要考虑不同情况的正则表达式写法。 1. 正整数的匹配:以可选的+号开头,或者没有符号,接着是至少一个数字。不过通常正整数可能直接以数字开头,不带+号,所以可能不需要考虑+号,或者作为可选部分。 2. 负整数的匹配:必须以-号开头,后面跟着至少一个数字。 3. 零的情况:单独一个0,或者可能有多个零的情况?比如用户可能输入"000",但严格来说这可能不是一个合法的整数,但有时可能允许。这里可能需要根据需求决定是否允许前导零。一般来说,可能不允许前导零,但用户的需求可能不同,需要确认。不过通常判断是否为整数时,前导零可能不影响数值,但正则表达式可能需要严格一点,比如不允许前导零,除了零本身。 所以,可能的模式是:允许可选的+或-符号,接着是非零数字开头,后面跟着其他数字,或者单独的0。例如,匹配类似123,-456,+789,0这样的数字。 于是,正则表达式可以写成:^[-+]?([1-9]\d*|0)$。这里的解释: - ^ 表示字符串开始 -+]? 表示可选的-或+ - 接下来是两种情况:要么是[1-9]后面跟着0个或多个数字(即至少一位,且第一位非零),要么是单独的0 - $ 表示字符串结束 这样就能匹配所有整数,包括正、负和零,同时不允许前导零(除了0本身)。 但需要考虑用户的需求是否允许前导零。例如,输入"0123"是否应该视为整数?如果是的话,正则表达式可以简化,允许数字部分以零开头。但根据常规的整数表示法,前导零是不允许的,所以可能需要排除这种情况。 另外,如果用户允许像"+0"或"-0"这样的形式,正则表达式是否需要处理?例如,-0是否被视为有效?根据数学上的定义,负零和零是相等的,但可能在程序中是否需要允许这样的输入?这可能需要根据具体情况而定。但常规情况下,可能允许-0,而+0也是允许的。 现在,回到Qt的实现。使用QRegularExpression类,构造这个正则表达式,然后使用match方法进行匹配。 可能的代码示例: QString input = "..."; QRegularExpression regex("^[-+]?([1-9]\\d*|0)$"); // 注意转义字符需要双反斜杠 QRegularExpressionMatch match = regex.match(input); bool isInteger = match.hasMatch(); 需要注意的是,在C++中,反斜杠需要转义,因此正则表达式中的\d需要写成\\d。因此,正确的正则表达式字符串应该是"^[-+]?([1-9]\\d*|0)$"。 测试用例: - "123" → 匹配 -456" → 匹配 - "+789" → 匹配 - "0" → 匹配 - "000" → 不匹配(因为前导零) - "-0" → 匹配(但根据实际需求可能需要调整) - "+0" → 匹配 - "0123" → 不匹配(因为前导零) - "abc" → 不匹配 - "123a" → 不匹配(因为有字符) 如果用户允许前导零,比如输入"000123"视为整数,那么正则表达式可以调整为允许零开头,即^[-+]?\d+$。但这样会允许像"00"这样的情况。不过这可能不符合严格整数的定义,但可能在某些情况下需要。 所以,需要明确用户的需求是否允许前导零。如果允许,则正则表达式可以更简单:^[-+]?\d+$,但必须确保至少有一个数字,且不能是空字符串。 此时,像"0", "123", "+123", "-123"都是有效的,但像"", "+", "-"这样的输入会被拒绝。 因此,在回答用户的问题时,需要说明这两种情况:是否允许前导零。然后给出对应的正则表达式。 总结可能的解决方案: 1. 不允许前导零的正则表达式:^[-+]?([1-9]\d*|0)$ 2. 允许前导零的正则表达式:^[-+]?\d+$ 根据用户的需求选择。通常第一种更严格,符合常规整数书写习惯。 然后,在Qt中使用QRegularExpression,并注意转义的问题。 最后,可能还需要考虑其他边界情况,比如空字符串,只有符号的情况(如"+", "-"),这些都会被正则表达式排除,因为\d+要求至少一个数字。 因此,最终的代码示例应该使用第一种正则表达式,并且正确转义。</think>Qt中使用正则表达式判断字符串是否为整数,可以通过`QRegularExpression`类实现。以下是详细步骤和示例代码: ### 正则表达式解释 **不允许前导零的情况**(推荐,符合常规整数格式): - `^[-+]?`:可选的正负号。 - `([1-9]\d*|0)$`:两种可能: - `[1-9]\d*`:非零开头,后跟任意数字(正整数/负整数绝对值部分)。 - `0`:单独的零。 **允许前导零的情况**(如接受"0123"): - `^[-+]?\d+$`:符号后跟至少一个数字(包括前导零)。 ### 示例代码(使用严格模式) ```cpp #include <QRegularExpression> #include <QDebug> bool isInteger(const QString &input) { QRegularExpression regex("^[-+]?([1-9]\\d*|0)$"); return regex.match(input).hasMatch(); } // 测试示例 int main() { qDebug() << isInteger("123"); // true qDebug() << isInteger("-456"); // true qDebug() << isInteger("+789"); // true qDebug() << isInteger("0"); // true qDebug() << isInteger("0123"); // false(前导零) qDebug() << isInteger("-0"); // true(视为合法,但实际等于0) qDebug() << isInteger("123a"); // false return 0; } ``` ### 关键点 1. **转义字符**:C++中需用双反斜杠`\\d`表示正则的`\d`。 2. **边界匹配**:`^`和`$`确保整个字符串匹配,避免部分匹配(如"123a")。 3. **前导零处理**:根据需求选择正则表达式,上述示例为严格模式。 ### 其他情况处理 - **空字符串/纯符号**:自动被正则排除(因需要数字)。 - **负零/正零**:正则允许,但逻辑上等同于0。 根据实际需求调整正则表达式以适应不同的格式要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值