Qt中用 QRegularExpression 代替QRegExp

来源:互联网 发布:怎么才能学好编程 编辑:程序博客网 时间:2024/06/07 19:08
Qt 5中引入的QRegularExpression类相对QRegExp有很大的改进,在提供的API方面,支持的模式语法和执行速度。最大的不同之处在于QRegularExpression简单地保存正则表达式,并且在请求匹配时不会修改它。相反,返回QRegularExpressionMatch对象,以便检查匹配的结果并提取捕获的子字符串。这同样适用于全局匹配和QRegularExpressionMatchIterator。
其他差异如下:
从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。

1 0
原创粉丝点击