一、背景
使用QT开发项目时,经常需要去对字符串进行操作,一般来说我们都会想到的是使用自己写的逻辑+QString的一些函数进行实现。
其实qt给我们提供了一个更好的方式去实现,那就是QRegExp对象,使用正则表达式来操作字符串。
只要我们会用,能用好,就能在软件开发中起到事半功倍的效果,而不是苦逼自己去实现一段段自己都觉得不靠谱的代码。
对于正则表达式的使用做一下分类,主要分为以下类型(官网内容):
用法 | 解释 | |
---|---|---|
1 | 验证 | 正则表达式可以测试子字符串是否满足某些标准,例如是整数或不包含空格。 |
2 | 搜索 | 正则表达式提供比简单的子字符串匹配更强大的模式匹配,例如,匹配单词mail、letter或communication之一,但不匹配单词email、mailman、mailer、letterbox等。 |
3 | 搜索和替换 | 正则表达式可以用不同的子字符串替换所有出现的子字符串,例如,用&替换所有出现的& 。除非&后面已经跟了一个amp; . |
4 | 字符串拆分 | 正则表达式可用于标识字符串应在何处拆分,例如拆分制表符分隔的字符串。 |
二、正则表达式符号解释
例子 | 解释 |
---|---|
[abc] | 方括号中间是几个字母,表示a,b,c这三个单独的字符 |
[^abc] | 除了a,b,c以外的字符 |
[a-z] | 横杠表示范围,匹配a到z之间(包括a和z)的所有单个字符 |
[a-zA-Z] | a到z、A到Z的所有单个字符 |
^ | 在一行最前 |
$ | 在一行的最后 |
\s | 匹配任意空白字符 |
\S | 匹配任意非空白的字符 |
\d | 任意数字 |
\D | 任意非数字 |
\w | 任意单字字符(字母、数字或下划线) |
\W | 任意非单字字符 |
`(a | b)` |
a? | ?代表0个或1个 |
a* | *代表0个或1个或多个 |
a+ | +代表1个或多个 |
a{3} | 3个a |
a{3,} | 3个或大于3个a |
a{3,6} | a的个数在3和6之间(包括3和6) |
三、输入限制
用QlineEdit作为例子展示我们常用的一些代码。
1、只输入数字
可输入数字为0-9,限制数字个数为1-5个、
QRegExp regExp("^[0-9]{1,5}$");
ui->edit_pos->setValidator(new QRegExpValidator(regExp));
2、限制int和float输入
2.1整数部分限制为0-9输入,最多输入5个数字;小数部分限制1-9输入,只能输入一位。
QRegExp regExp("^[0-9]{1,5}([.][1-9]{1})?$");
ui->edit_pos->setValidator(new QRegExpValidator(regExp));
2.2带范围的整型输入:
ui->edit_pos->setValidator(new QIntValidator(0, 1000, this));
2.3带范围的浮点型输入:
lineEdit->setValidator(new QDoubleValidator(-180.0,180.0,6,this));
3、任意正整数限制输入
如限制0-120大小的数字输入,字符如下:
^([1-9]|([1-9][0-9])|([1-2][0-1][0-9]))$|^[1][2][0]$
4、限制数字和某些字符输入
如电话号码,限制0-9数字输入和“-”、“+”,格式如下:
QRegExp regSampleNumber("^[0-9.-.+]{30}$");
5、限制首个字符必须为某个符号
如限制首个字母必须为+、-或者0-9的字符,合适如下:
QRegExp regAge("[-|+|0-9][0-9.]{12}$");
“[-|+|0-9]”表示第一个字符只能是+、-或者0-9的字符,后面的[0-9.]{12}表示第二个字符开始只能输入0-9、.字符,最多12个字符。
6、限制中文输入
即除了中文其他都能输入:
QRegExp regAge("^([^\u4e00-\u9fa5]){0,16}$")
7、输入格式 (年-月-日):
ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$")));
8、输入格式(月/日/年):
ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$" )));
四、字符串验证
字符串验证就是验证对应的内容是否符合你依据正则表达式设定的规则,示例代码如下:
QRegExp rx("*.txt");
rx.setPatternSyntax(QRegExp::Wildcard);
rx.exactMatch("README.txt"); // returns true
rx.exactMatch("welcome.txt.bak"); // returns false
五、字符串截取
这个一般是用于在一段字符串中依据规则找到你需要的内容,示例代码如下:
QRegExp rx("(\\d+)(?:\\s*)(cm|inch)");
int pos = rx.indexIn("Length: 175cm");
if (pos > -1)
{
QString len = rxlen.cap(1); // "175"
QString unit = rxlen.cap(2); // "cm"
}