其他差异如下:
从QRegExp :: exactMatch()移植
Qt 4中的QRegExp :: exactMatch()提供了两个目的:它与正则表达式与主题字符串完全匹配,并且实现了部分匹配。
从QRegExp的完全匹配移植
精确匹配表示正则表达式是否与整个主题字符串匹配。例如,主题字符串“abc123”上的类收益:QRegularExpression中没有反映精确匹配。如果要确保主题字符串与正则表达式完全匹配,则可以将模式包含在两个锚定表达式之间。在大多数情况下,简单地将模式放在^和$锚之间就足够了
QRegularExpression re(“^这个模式必须完全匹配$”);
但是,请记住,$ anchor不仅匹配字符串的末尾,而且在字符串结尾之前的换行符也匹配;也就是说,以前的模式与字符串匹配“此模式必须完全匹配\ n”。此外,如果MultiLineOption被显式设置(作为模式选项)或隐式(作为模式字符串中的指令),则^和$ anchor的行为将发生更改。
因此,在最常见的情况下,您应该将模式包含在\ A和\ z anchors之间:
QString p(“a.* | pattern”);
QRegularExpression re(“\\ A(?”+ p +“)\\ z”); //重新匹配模式字符串p
请注意非捕获组的用法,以保留模式中分支操作符的含义。
从QRegExp的部分匹配移植
当使用QRegExp :: exactMatch()时,如果没有找到完全匹配的话,还可以通过调用QRegExp :: matchedLength()找出正则表达式匹配的主题字符串的多少。如果返回的长度等于主题字符串的长度,则可以得出结论,发现部分匹配。QRegularExpression通过适当的MatchType显式地支持部分匹配。
全局匹配
由于QRegExp API的限制,不可能正确实现全局匹配(就像Perl一样)。特别地,匹配0个字符的模式(如“a *”)是有问题的。QRegularExpression :: globalMatch()正确实现Perl全局匹配,返回的迭代器可用于检查每个结果。
Unicode属性支持
当使用QRegExp时,诸如\ w,\ d等字符类将字符与相应的Unicode属性相匹配:例如,\ d将任何字符与Unicode Nd(十进制数字)属性相匹配。当使用QRegularExpression时,这些字符类默认匹配ASCII字符:例如,\ d与0-9 ASCII范围内的字符完全匹配。可以使用UseUnicodePropertiesOption模式选项来更改此行为。
通配符匹配
在QRegularExpression中没有等价的通配符匹配。然而,将通配符语法中的正则表达式重写为Perl兼容的正则表达式是一项非常简单的任务,因为QRegExp支持的通配符非常简单。其他模式语法
QRegularExpression仅支持Perl兼容的正则表达式。最小匹配
QRegExp :: setMinimal()通过简单地反转量词的贪婪来实现最小匹配(QRegExp不支持惰性量词,如*?+?等)。 QRegularExpression反而支持贪婪,懒惰和占有量词。 InvertedGreedinessOption模式选项可以用于模拟QRegExp :: setMinimal()的效果:如果启用,它会反转量词的贪婪(贪婪的变得懒惰,反之亦然)。
插入模式AnchoredMatchOption匹配选项可用于模拟QRegExp :: CaretAtOffset行为。没有其他QRegExp :: CaretMode模式的等价物。
调试使用QRegularExpression的代码
QRegularExpression内部使用即时编译器(JIT)来优化匹配算法的执行。 JIT广泛使用自修改代码,这可以导致Valgrind等调试工具崩溃。 如果要使用QRegularExpression调试程序(f.i.,请参阅Valgrind的--smc-check命令行选项),必须启用所有检查自修改代码。 启用此类检查的缺点是您的程序运行速度会慢得多。
为了避免这种情况,如果在调试模式下编译Qt,则默认情况下禁用JIT。 通过将QT_ENABLE_REGEXP_JIT环境变量分别设置为非零或零值,可以覆盖默认值并启用或禁用JIT使用(无论是在调试还是释放模式)。
另请参见QRegularExpressionMatch和QRegularExpressionMatchIterator。