簡體   English   中英

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

[英]QString::replace(const QRegExp &, const QString &) and QString::replace(const QRegularExpression &, const QString &) work differently

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

謝謝

QRegExp對\\s使用Unicode“分隔符”類別。 這包括\\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

否則,可以使用PCRE的特殊“水平空間”和“垂直空間”類使用(\\h|\\v) (C ++字符串形式為"(\\\\h|\\\\v)" )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM