QString :: replace(const QRegExp&,const QString&)和QString :: replace(const QRegularExpression&,const QString&)以不同的方式工作

时间:2013-06-24 16:07:31

标签: c++ qt qstring

为什么用Qt 5.1.0 Release Candidate函数QString :: replace(const QRegExp& rx,const QString& after)以某种方式处理\ v和QString :: replace(const QRegularExpression& re,const QString& after)以另一种方式? 这就是我使用的代码的和平:

QString ss("a\t\v  bc \t cdef\vg\r\r\t hi");
QString ss1(ss);
ss1.replace(QRegExp("\\s{2,}"), " ");
QString ss2(ss);
ss2.replace(QRegularExpression("\\s{2,}"), " ");

调试器的值为:

ss  "a\t\013  bc \t cdef\013g\r\r\t hi"
ss1 "a bc cdef\013g hi"
ss2 "a\t\013 bc cdef\013g hi"

谢谢

1 个答案:

答案 0 :(得分:2)

QRegExp使用\s的Unicode“分隔符”类别。这包括\v

QRegularExpression是PCRE的包装器,其中文档说明(http://pcre.org/pcre.txt):

  

为了与Perl兼容,\ s与VT字符不匹配   (码          11)。这使它与POSIX“space”类不同。 \ s          字符是HT(9),LF(10),FF(12),CR(13)和空格(32)。如果          “使用locale;”包含在Perl脚本中,\ s可能与VT字符匹配 -          之三。在PCRE中,它永远不会。

尽管文档说它永远不会匹配\v,但您可以尝试将UseUnicodePropertiesOption选项传递给QRegularExpression,这会更改字符类以使用Unicode属性,因此理论上除非有特定的例外内置于PCRE中,\s应与\v匹配。

如果失败,您可以使用(\h|\v)(使用"(\\h|\\v)"的C ++字符串形式),使用PCRE的特殊“水平空格”和“垂直空间”类。