QRegExp

 "^\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
        }

<think>好的,我现在需要帮助用户了解QtQRegExp的使用方法和示例。首先,我得回忆一下QRegExp的基本概念和它在Qt中的角色。QRegExpQt正则表达式类,用于字符串匹配和处理,不过在Qt 5之后,官方推荐使用QRegularExpression,但用户可能还在维护旧代码,所以需要同时覆盖这两部分。 接下来,用户的需求是使用QRegExp,所以我要先介绍基本用法,包括如何创建实例、常用方法如exactMatch()、匹配模式、捕获组等。然后给出具体的示例代码,比如验证邮箱格式、提取子字符串、替换文本等。这些示例需要符合Qt的语法,并且确保代码正确,比如在.pro文件中添加必要的模块。 同时,用户提供的引用内容里有提到.pro文件的配置,比如QT += network,但QRegExp属于核心模块,所以可能需要确认是否需要额外添加模块。不过通常QRegExpQtCore中,所以可能不需要额外配置,但为了安全起见,可以建议用户包含核心模块。 另外,考虑到用户可能遇到的常见问题,比如性能问题或迁移到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>### QRegExpQt中的使用与示例 #### 1. QRegExp基础用法 QRegExpQt中用于处理正则表达式的类,支持字符串匹配、搜索和替换功能。以下是其核心方法: - **构造函数**:`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语法和性能优化。QRegExpQt 6中已移除。 ####
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值