为什么用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"
谢谢
答案 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的特殊“水平空格”和“垂直空间”类。