QT 正则表达式

学习交流群:622684416

学习1

1、函数 :
indexIn() 返回在待检测字符串中,第一个符合表达式规则的位置

captureCount()返回匹配个数,但是不止为何,比capturedTexts()返回list的count少1

capturedTexts()返回匹配后的列表,扩张一下QStringList的count和size是一样的

2、实例

QRegExp rx("(\\d+)(\\s*)(cm|inch(es)?)");// 例如,"inch(es)?" 可以匹配 "inch" 或 "inches" ;? 等价于 {0,1}。
int pos = rx.indexIn("Length: 36 inches");
qDebug() << pos;//8
qDebug() << rx.captureCount();//4
QStringList list = rx.capturedTexts();
qDebug() << list.count();//5
qDebug() << list.size();//5
for (int i = 0; i < list.size(); i++)
{
	qDebug() << i << " capturedTexts  " << list[i];
	qDebug() << i << " cap  " << rx.cap(i);
}
// list is now ("36 inches", "36", " ", "inches", "es")

理解:
1、首先是优先级
\ 转义符
(), (?😃, (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序)
| 替换,“或"操作字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food”。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。

2、capturedTexts() 帮助文档中的解释,言简意赅
The first string in the list is the entire matched string. Each subsequent list element contains a string that matched a (capturing) subexpression of the regexp.
list 中的0的完整匹配字符,其余对应()的顺序匹配字符。

3、看到上面list结果的时候,不知道大家有没有这么个疑问,为什么没有单独匹配“inch”的输出呢?
明明"inch(es)?" 可以匹配 “inch” 或 “inches” 。我承认开始我是有这个疑问的
再来理解下“cm|inch(es)?”,
首先,"(es)?"的优先级最高,0或者1个es
其次,"inch(es)?"解析后应该是inch 或者inches
最后,“cm|inch(es)?”解析后应该是cm 或者inch 或者inches
以上没毛病啊!!!!
下面做几个实验:
a、“Length: 36 inches"改成"Length: 36 inch”
得到的结果是(“36 inch”, “36”, " “, “inch”, “”)
b、“Length: 36 inches"改成"Length: 36 cm”
得到的结果是(“36 cm”, “36”, " “, “cm”, “”)
c、”(\d+)(\s*)(cm|inch(es)?)“改成”(\d+)(\s*)(cm|inch|inches)”
得到的结果是(“36 inches”, “36”, " ", “inches”)

4、看list is now (“36 inches”, “36”, **" " **, “inches”, **“es” **)中有多余的项,该怎么处理呢?
查看帮助文档的,紧接着就有讲

 QRegExp rx("(\\d+)(?:\\s*)(cm|inch(?:es)?)");
 int pos = rx.indexIn("Length: 36 inches");
 qDebug() << rx.captureCount();//2
 QStringList list = rx.capturedTexts();
 qDebug() << list.count();//3
 qDebug() << list.size();//3
 for (int i = 0; i < list.size(); i++)
 {
	qDebug() << i << " capturedTexts  " << list[i];
	qDebug() << i << " cap  " << rx.cap(i);
 }
  // list is now ("36 inches", "36", "inches")

再来理解下正则表达式的元字符
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符
\d 匹配一个数字字符。等价于 [0-9]。

  • 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
  • 匹配前面的子表达式零次或多次
    \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
    (?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 ‘industry|industries’ 更简略的表达式。

在这里插入图片描述
这个图太经典,不放觉得可惜了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值