2013-06-24 60 views
1

爲什麼使用Qt 5.1.0發佈候選函數QString :: replace(const QRegExp & rx,const QString & after)以某種方式處理\ v並以另一種方式處理QString :: replace(const QRegularExpression & re,const QString &)? 這是我用的代碼和平:QString :: replace(const QRegExp&,const QString&)和QString :: replace(const QRegularExpression&,const QString&)的工作方式不同

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" 

謝謝

回答

2

QRegExp使用Unicode 「分隔符」 類別\s。這包括\v

QRegularExpression是圍繞PCRE,一個包裝,其中的文檔狀態(http://pcre.org/pcre.txt):

對於用Perl兼容性,\ s不所述VT字符 (代碼 11)相匹配。這使得它不同於POSIX「空間」類。字符是HT(9),LF(10),FF(12),CR(13)和空格(32)。如果 「使用語言環境;」包含在Perl腳本中,\ s可以匹配VT字符。在PCRE中,它永遠不會。

雖然文件說,它永遠不會匹配\v,你可以嘗試傳遞UseUnicodePropertiesOption選項將QRegularExpression,這改變了字符類使用Unicode屬性,因此從理論上講,除非特定的異常被內置到PCRE, \s應匹配\v

如果不成功,可以使用(\h|\v)(使用C++字符串形式,即"(\\h|\\v)"),使用PCRE的特殊「水平空間」和「垂直空間」類。