QRegExp

本文详细介绍Qt中正则表达式的使用方法,包括如何验证文本的有效性、提取数据及修改文本,并提供了丰富的示例代码。

 QRegExp       

分类:            qt 331人阅读 评论(0) 收藏 举报
"^\d+$"                       //非负整数(正整数 + 0)
"^[0-9]*[1-9][0-9]*$"   //正整数
"^((-\d+)|(0+))$"          //非正整数(负整数 + 0)
"^-[0-9]*[1-9][0-9]*$"  //负整数
"^-?\d+$"               //整数
"^\d+(\.\d+)?$"           //非负浮点数(正浮点数 + 0)
"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数
"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"                                                                      //非正浮点数(负浮点数 + 0)
"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数
"^(-?\d+)(\.\d+)?$"   //浮点数
"^[A-Za-z]+$"           //由26个英文字母组成的字符串
"^[A-Z]+$"                //由26个英文字母的大写组成的字符串
"^[a-z]+$"                 //由26个英文字母的小写组成的字符串
"^[A-Za-z0-9]+$"   //由数字和26个英文字母组成的字符串
"^\w+$"                   //由数字、26个英文字母或者下划线组成的字符串
"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"                               //email地址
"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"             //url
"^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$"                   // 年-月-日
"^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$"                   // 月/日/年
"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"   //Email
"(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?"                                          //电话号码
"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$"   //IP地址

^([0-9A-F]{2})(-[0-9A-F]{2}){5}$                    //MAC地址的正则表达式
^[-+]?\d+(\.\d+)?$                                           //值类型正则表达式

QRegExp是Qt的正则表达式类.
Qt中有两个不同类的正则表达式.
第一类为元字符.它表示一个或多个常量表达式.
令一类为 转义字符,它代表一个特殊字符.

一.元字符
. 匹配任意单个字符.                      例如, 1.3 可能是1. 后面跟任意字符,再跟3
^ 匹配字符串首.                             例如, ^12可能是123,但不能是312
$ 匹配字符串尾.                            例如, 12$可以是312, 当不能是 123
[] 匹配括号内输入的任意字符.    例如[123]可以为1, 2 或3
* 匹配任意数量的前导字符.         例如, 1*2可以为任意数量个1(甚至没有), 后面跟一个2
+ 匹配至少一个前导字符.             例如, 1+2必须为一个或多个1, 后跟一个2
? 匹配一个前导字符或为空.         例如 1?2可以为2或12

二.统配模式
通过 QRegExp::setPatternSyntax(QRegExp::Wildcard);可以将元字符设置为统配模式.在统配模式下,只有3个元字符可以使用.他们的功能没有变化.
? 匹配任意单个字符,             例如, 1?2可以为1,后面跟任意单个字符, 再跟2
* 匹配任意一个字符序列.      例如, 1*2, 可以为1, 后面跟任意数量的字符, 再跟一个2
[] 匹配一个定义的字符集合. 例如, [a-zA-Z\.]可以匹配 a到z之间任意一个字符和. [^a]匹配出小写a以外的字符.

三.转义序列
\.  匹配 "."
\^  匹配 "^"
\$ 匹配 "$"
\[  匹配 "["
\]  匹配 "]"
\*  匹配 "*"
\+ 匹配 "+"
\? 匹配 "?"
\b 匹配 响铃字符,使计算机发出嘟的一声.
\t  匹配 制表符号
\n 匹配 换行符号
\r  匹配 回车符

\s 匹配 任意空格
\xnn 匹配 16进制为nn的字符
\0nn 匹配 8进制的nn字符
这些表达式均以\开始, 与C++的转义字符相同,所以为了定义QRegExp中的一个转义序列,
需要在前面添加\\

///下面是示例

 

QRegExp rx("([\\dA-F]{2}-){6}"); 

 

QString str = tr("blue (00-14-38-15-58-F4-) sa 的dfasd"); 

    int pos =  rx.indexIn(str); 

    if(pos > -1){ 

         QString s = rx.cap(0); 

        s.chop(1); 

        qDebug() << s   ; 

    } 

 

    ///同样的 bluetooth BDADDR 地址: 

    QRegExp rx("(([\\dA-F]{2}:){5})([\\dA-F]{2})"); 

    QString str = tr("bluetooth (00:14:38:15:58:F4) sa 的dfasd"); 

        int pos =  rx.indexIn(str); 

 

        if(pos > -1){ 

            QString s = rx.cap(0); 

            s.chop(1); 

            qDebug() << s   ;  /// Output : 00:14:38:15:58:F4 

        } 

 

 

http://www.cnblogs.com/frankbadpot/archive/2009/10/18/1583617.html

用正则表达式验证文本有效性

你可以使用QRegExp::exactMatch来判断一个字符串是否符合一个pattern。

void testRegexMatch()
{
    QString pattern(
" .*=.* " );
    QRegExp rx(pattern);

   
bool match = rx.exactMatch( " a=3 " );
    qDebug()
<< match;                      // True

    match
= rx.exactMatch( " a/2 " );
    qDebug()
<< match;                      // False
}

用正则表达式提取数据

你可以利用利用正则表达式从一个字符串里提取特定的字段或数据。例如,你可以用以下代码从"a=100"里提取"a"和"100"。

void testRegexCapture()
{
    QString pattern(
" (.*)=(.*) " );
    QRegExp rx(pattern);

    QString str(
" a=100 " );
   
int pos = str.indexOf(rx);              // 0, position of the first match.
                                           
// Returns -1 if str is not found.
                                           
// You can also use rx.indexIn(str);
    qDebug() << pos;
   
if ( pos >= 0 )
    {
        qDebug()
<< rx.matchedLength();     // 5, length of the last matched string
                                           
// or -1 if there was no match
        qDebug() << rx.capturedTexts();     // QStringList("a=100", "a", "100"),
                                           
//    0: text matching pattern
                                           
//    1: text captured by the 1st ()
                                           
//    2: text captured by the 2nd ()

        qDebug()
<< rx.cap( 0 );              // a=100, text matching pattern
        qDebug() << rx.cap( 1 );              // a, text captured by the nth ()
        qDebug() << rx.cap( 2 );              // 100,

        qDebug()
<< rx.pos( 0 );              // 0, position of the nth captured text
        qDebug() << rx.pos( 1 );              // 0
        qDebug() << rx.pos( 2 );              // 2
    }
}

用正则表达式修改文本

你可以把字符串中匹配的字符串替换成"一般字符串"

    QString s = " a=100 " ;
    s.replace(QRegExp(
" (.*)= " ), " b= " );
    qDebug()
<< s;                          // b=100

或是把字符串中匹配的字符串替换"提取的字符串"

    QString s = " a=100 " ;
    s.replace(QRegExp(
" (.*)=(.*) " ), " \\1\\2=\\2 " );  // \1 is rx.cap(1), \2 is rx.cap(2)
    qDebug() << s;                                  // a100=100

http://www.thisisqt.com/forum/viewthread.php?tid=239

Regexp是由表达式,量词和声明组成的。最简单的表达式是一个字符,如x或是5。一个表达式也可以是一个用方括号包裹的字符集。[ABCD]将会匹配一个A或者一个B或者一个C或者一个D。我们也可以写成[A-D],这跟[ABCD]所要表达的是一样的意思。而[A-Z]则可以匹配任何一个大写字母。
一个量词指明表达式出现的次数。x{1,1} 匹配一个但仅仅一个x。x{1,5} 意味着匹配至少一个但不超过5个的x。

如果你看到其他地方的regexp,它们可能看起来跟上面有所不同,这是因为一个字符集和量词太常用了以至于它们也可以通过其他的字符来表达。如[0-9] 可以用\d来代替。而{1,1}来表示出现次数则可以用字符本身即可,如x{1,1}和x是一样的。

如果想匹配一个单词,如mail,我们可以写成m{1,1}a{1,1}i{1,1}l{1,1},但由于字符表达式数量默认为1,因此我们也可以就直接写成mail。现在我们来看看匹配多个单词的情况。如果我们想同时匹配mail或者letter或者correspondence又该怎么写呢?这里我们需要用到|符号,我们可以写成mail|letter|correspondence,这个表达式可以匹配这三个单词,但同时它也会匹配我们不想要的单词,如email。为了防止这种情况,我们需要说明单词的边界。

首先我们用圆括号将我们的表达式包裹起来,(mail|letter|correspondence)。圆括号可以将我们的表达式聚合起来。其次我们还需要使用\b单词边界声明

http://blog.youkuaiyun.com/daysummer/article/details/561038

c 匹配字符 'c'

. 匹配任意字符
^ 匹配一个输入的开始
$ 匹配一个输入的结束
[] 匹配一个字符串集的定义 - see below.
a* matches a sequence of zero or more a's (可以是a,ab,ade等;*可以代表任意个字符,包括0个)
a+ matches a sequence of one or more a's  (可以是ab,ade,aeee等,但不能是a;+只代表一个以上的字符)
a? matches an optional a     匹配可选的a  (可以是ab,ac,ad等,但不能是a,或ade;?只代表一个字符)

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值