QRegExp

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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;?只代表一个字符)

 

<think>好的,我现在需要帮助用户了解Qt中QRegExp的使用方法和示例。首先,我得回忆一下QRegExp的基本概念和它在Qt中的角色。QRegExp是Qt的正则表达式类,用于字符串匹配和处理,不过在Qt 5之后,官方推荐使用QRegularExpression,但用户可能还在维护旧代码,所以需要同时覆盖这两部分。 接下来,用户的需求是使用QRegExp,所以我要先介绍基本用法,包括如何创建实例、常用方法如exactMatch()、匹配模式、捕获组等。然后给出具体的示例代码,比如验证邮箱格式、提取字符串、替换文本等。这些示例需要符合Qt的语法,并且确保代码正确,比如在.pro文件中添加必要的模块。 同时,用户提供的引用内容里有提到.pro文件的配置,比如QT += network,但QRegExp属于核心模块,所以可能需要确认是否需要额外添加模块。不过通常QRegExp在QtCore中,所以可能不需要额外配置,但为了安全起见,可以建议用户包含核心模块。 另外,考虑到用户可能遇到的常见问题,比如性能问题或迁移到QRegularExpression,需要给出注意事项和建议。例如,在Qt 6中QRegExp已被移除,所以如果用户的项目需要长期维护,建议迁移。 最后,生成相关问题,帮助用户进一步学习,比如QRegExp和QRegularExpression的区别,如何进行更复杂的匹配,常见问题解决等。这些问题需要覆盖用户可能遇到的后续疑问,确保他们能够深入理解和应用。 现在需要组织这些内容,确保结构清晰,先介绍用法,再示例,然后注意事项,最后相关问题。同时检查LaTeX格式是否正确,所有行内公式用$...$,独立公式用$$...$$,不过在这个回答中可能数学公式较少,但如果有涉及的地方需要注意。另外,引用用户提供的引用内容,比如在注意事项里提到Qt 3支持已经被弃用,可以引用用户提供的引用[1],但要注意相关性。不过用户提供的引用[1]和[2]似乎和QRegExp关系不大,可能需要确认是否有必要引用。但根据用户给的引用内容,引用[1]提到禁止Qt3支持,引用[2]是网络编程的例子,可能和QRegExp无关,所以可能不需要在回答中引用这些,但根据系统指令,需要在回答中引用的段落末尾添加引用标识。不过用户的问题是关于QRegExp,而提供的引用似乎不相关,可能需要忽略,或者可能用户误贴了引用内容。这里可能需要按照系统指令,但如果没有相关引用,可能不需要添加。需要再仔细看用户的引用内容:引用[1]提到Qt3支持,引用[2]是网络编程的.pro文件示例。可能用户在提问时误放了这些引用,但根据系统指令,回答中引用的段落末尾需要自然地添加引用标识。但当前关于QRegExp的回答是否涉及这些引用呢?可能不相关,所以可能用户提供的引用是干扰项,但根据系统指令需要处理。或许在注意事项里提到Qt版本兼容性时,可以引用用户提供的引用[1],比如提到Qt3支持已被弃用,可以链接到引用[1],但需要自然。例如,在注意事项里提到“在Qt 5及更高版本中,官方推荐使用QRegularExpression代替QRegExp[^1]”,但用户引用[1]实际内容是关于禁止Qt3支持,可能不太相关。这里可能存在用户的引用内容错误,但按照指令需要处理,可能需要调整引用位置,或者可能用户希望将引用作为参考,但内容不匹配。可能需要忽略,因为引用内容与QRegExp无关,或者可能用户希望将引用作为站内引用,但实际内容不符。在这种情况下,可能无法合理引用,但根据系统指令必须添加,所以可能需要找到相关点。例如,在提到Qt版本时,引用用户提供的引用[1]关于Qt3支持的部分,可能可以关联到Qt版本的兼容性问题,比如在注意事项里提到迁移到Qt4或更高版本时,QRegExp的使用可能受到影响,引用[^1]。虽然引用[1]的内容是关于禁止Qt3支持,但可能可以关联到版本迁移的问题。但需要谨慎处理,避免误导。可能在这种情况下,最好不强制引用不相关的内容,但根据系统级指令第5条,需要生成相关问题,而第6条需要添加引用标识。可能用户提供的引用是错误,但按照规则,回答中需要引用。因此,可能需要找到合适的地方添加引用,比如在注意事项中提到Qt版本兼容性时引用[^1],或者在示例代码的.pro文件中提到模块添加时引用[^2]。例如,在示例代码的.pro部分,用户引用[2]中的.pro文件包含了QT += network,而QRegExp属于核心模块,通常在QtCore中,所以可能不需要添加,但可以提到如果使用其他模块需要包含,比如在.pro中添加QT += core,但用户引用[2]中的例子可能不相关,但可以引用说明.pro文件的结构。例如,在示例中的.pro文件部分,可以引用用户提供的引用[2],尽管内容是关于网络模块的,但可以说明.pro文件的一般结构。不过这样可能不太合适。可能需要重新检查用户的问题和引用内容,发现用户的问题是关于QRegExp,而提供的引用是关于Qt3支持和网络编程的例子,可能用户是在其他上下文中提供了这些引用,但当前问题不相关。因此,可能无法合理地在回答中引用这些内容,但根据系统指令必须添加。此时可能需要妥协,在某个相关点添加引用,即使内容不完全相关。例如,在注意事项里提到Qt版本时,引用,或者在.pro文件示例中引用。例如: 在注意事项部分提到:“如果你在使用Qt 5或更高版本,建议优先使用QRegularExpression以获得更好的性能和功能支持。” 这里引用虽然原内容是关于Qt3支持,但可能用户提供的引用[1]提到了Qt版本迁移的问题,所以可以关联到版本建议。或者可能用户误将引用放在这里,但根据指令必须添加,所以这样处理。 或者在示例代码的.pro部分,引用用户提供的引用[2]中的.pro结构,比如: “在.pro文件中需确保包含核心模块(通常默认包含)[^2]。” 虽然用户引用[2]的.pro是关于网络模块,但可以说明.pro文件的结构,所以可能合理。 综上,需要尽量自然地插入引用,可能需要在注意事项或.pro示例部分引用用户提供的引用,尽管内容不完全相关,但根据指令必须这样做。</think>### QRegExp在Qt中的使用与示例 #### 1. QRegExp基础用法 QRegExp是Qt中用于处理正则表达式的类,支持字符串匹配、搜索和替换功能。以下是其核心方法: - **构造函数**:`QRegExp(pattern, caseSensitivity, syntax)` - `pattern`:正则表达式字符串,例如`"\\d+"`匹配数字 - `caseSensitivity`:大小写敏感选项(默认`Qt::CaseSensitive`) - `syntax`:语法规则(默认`QRegExp::RegExp`) - **完全匹配**:`exactMatch()`,例如验证邮箱格式: ```cpp QRegExp emailRegex("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"); if (emailRegex.exactMatch("user@example.com")) { qDebug() << "Valid email"; } ``` - **捕获组**:通过`cap(n)`获取匹配的子字符串,例如提取日期: ```cpp QRegExp dateRegex("(\\d{4})-(\\d{2})-(\\d{2})"); if (dateRegex.indexIn("2023-10-05") != -1) { QString year = dateRegex.cap(1); // 输出"2023" } ``` #### 2. 实际应用示例 **示例1:验证输入合法性** ```cpp QRegExp phoneRegex("^1[3-9]\\d{9}$"); // 匹配手机号 if (!phoneRegex.exactMatch(userInput)) { QMessageBox::warning(this, "错误", "手机号格式无效"); } ``` **示例2:文本替换** ```cpp QString text = "Price: $99.99"; QRegExp priceRegex("\\$(\\d+\\.\\d{2})"); text.replace(priceRegex, "¥\\1"); // 替换为"Price: ¥99.99" ``` **示例3:分割字符串** ```cpp QStringList parts = text.split(QRegExp("\\s+")); // 按空格分割文本 ``` #### 3. 配置文件(.pro) 确保项目中包含`core`模块(默认已包含): ```makefile QT += core ``` #### 4. 注意事项 1. **性能问题**:复杂正则可能导致性能下降,建议预编译正则表达式: ```cpp static QRegExp regex("pattern"); // 避免重复编译 ``` 2. **语法差异**:QRegExp与Perl正则略有不同,例如需转义`{ }`等字符。 3. **版本兼容性**:Qt 5及以上推荐使用`QRegularExpression`,其支持更完整的PCRE语法和性能优化。QRegExp在Qt 6中已移除。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值