首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QString::replace(const QRegExp &,const QString &)和QString::replace(const QRegularExpression &,const QString &)的工作方式不同

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

Stack Overflow用户
提问于 2013-06-25 00:07:31
回答 1查看 1.3K关注 0票数 1

为什么在Qt 5.1.0候选版本中,函数QString::replace(const QRegExp & rx,const QString & after)以另一种方式处理\v,QString::replace(const QRegularExpression & re,const QString & after)?这就是我使用的最简单的代码:

代码语言:javascript
复制
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,}"), " ");

调试器的值为:

代码语言:javascript
复制
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"

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-25 00:28:20

对于\s,QRegExp使用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)。如果Perl脚本中包含"use locale;“,\s可能与VT字符匹配。在PCRE中,它永远不会。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17280005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档