关于正则的两个有关问题
关于正则的两个问题
第一个问题如下面代码:
QRegExp rxlen("(\\d+)(?:\\s*)(cm|inch)");
int pos3 = rxlen.indexIn("Length: 189cm");
if (pos3 > -1) {
QString value = rxlen.cap(1); // 结果为189
QString unit = rxlen.cap(2); // 结果为cm
QString string = rxlen.cap(0); // 结果为189cm
qDebug() << value << unit << string;
}
小问题1:(?:\\s*)这个代表什么意思?
小问题2:为什么QString string = rxlen.cap(0);的结果为189cm??.cap(0)和.cap(1)我能理解,就是代表匹配后的第一和第二个字符,但是.cap(0)不清楚什么意思。
第二个问题乳下面代码:
QRegExp rx5("\\b(\\w+)\\W+\\1\\b");
rx5.setCaseSensitivity(Qt::CaseInsensitive); // 设置不区分大小写
qDebug() << rx5.indexIn("Hello--hello"); // 结果为0
qDebug() << rx5.cap(1); // 结果为Hello
小问题3:我觉得qDebug() << rx5.cap(1); 这条语句执行后的代码应该是“Hello--”,但是为什么是“Hello”呢,我觉得"Hello--hello"符合匹配规则的是“Hello--”,且只有这么一个符合条件。
大家帮我分析下啊,谢谢了。
------解决方案--------------------
1. ?: 表示只进行匹配, 不将匹配的结果记入分组里面. 比如
"(\\d+)(?:\\s*)(cm
------解决方案--------------------
inch)" 匹配 "189 cm" 的结果是: "189", "cm"
"(\\d+)(\\s*)(cm
------解决方案--------------------
inch)" 匹配 "189 cm" 的结果就是: "189", " ", "cm"
2. 匹配结果的第 0 项表示整个匹配的字符串, 第一项才表示匹配的第一个分组, 第二项表示匹配的第二个分组...
3. cap(1) 是匹配的字符串里的第一个分组, 不是整个匹配的字符串. 第一个分组是 (\\w+) 部分, 所以是 "Hello"
第一个问题如下面代码:
QRegExp rxlen("(\\d+)(?:\\s*)(cm|inch)");
int pos3 = rxlen.indexIn("Length: 189cm");
if (pos3 > -1) {
QString value = rxlen.cap(1); // 结果为189
QString unit = rxlen.cap(2); // 结果为cm
QString string = rxlen.cap(0); // 结果为189cm
qDebug() << value << unit << string;
}
小问题1:(?:\\s*)这个代表什么意思?
小问题2:为什么QString string = rxlen.cap(0);的结果为189cm??.cap(0)和.cap(1)我能理解,就是代表匹配后的第一和第二个字符,但是.cap(0)不清楚什么意思。
第二个问题乳下面代码:
QRegExp rx5("\\b(\\w+)\\W+\\1\\b");
rx5.setCaseSensitivity(Qt::CaseInsensitive); // 设置不区分大小写
qDebug() << rx5.indexIn("Hello--hello"); // 结果为0
qDebug() << rx5.cap(1); // 结果为Hello
小问题3:我觉得qDebug() << rx5.cap(1); 这条语句执行后的代码应该是“Hello--”,但是为什么是“Hello”呢,我觉得"Hello--hello"符合匹配规则的是“Hello--”,且只有这么一个符合条件。
大家帮我分析下啊,谢谢了。
正则
------解决方案--------------------
1. ?: 表示只进行匹配, 不将匹配的结果记入分组里面. 比如
"(\\d+)(?:\\s*)(cm
------解决方案--------------------
inch)" 匹配 "189 cm" 的结果是: "189", "cm"
"(\\d+)(\\s*)(cm
------解决方案--------------------
inch)" 匹配 "189 cm" 的结果就是: "189", " ", "cm"
2. 匹配结果的第 0 项表示整个匹配的字符串, 第一项才表示匹配的第一个分组, 第二项表示匹配的第二个分组...
3. cap(1) 是匹配的字符串里的第一个分组, 不是整个匹配的字符串. 第一个分组是 (\\w+) 部分, 所以是 "Hello"