1

为什么使用 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"

谢谢

4

1 回答 1

2

QRegExp 将 Unicode “分隔符”类别用于\s. 这包括\v.

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

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

虽然文档说它从不匹配\v,但您可以尝试将UseUnicodePropertiesOption选项传递给 QRegularExpression,它会更改字符类以使用 Unicode 属性,因此理论上,除非 PCRE 中内置了特定异常,否则\s应该匹配\v

如果做不到这一点,您可以使用(\h|\v)(以 C++ 字符串形式 that's "(\\h|\\v)"),使用 PCRE 的特殊“水平空间”和“垂直空间”类。

于 2013-06-24T16:28:19.647 回答