学习交流群: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’ 更简略的表达式。
这个图太经典,不放觉得可惜了