2013-06-24 4 views
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 :: 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 использует категорию Юникод "разделитель" для \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 charac- ter. В PCRE этого никогда не происходит.

Хотя документация говорит, что никогда не соответствует \v, вы могли бы попробовать пропускание варианта UseUnicodePropertiesOption к QRegularExpression, который изменяет классы символов, чтобы использовать свойство Unicode, так что в теории, если конкретное исключение не встраиваются в PCRE, \s должно соответствовать \v.

В противном случае вы можете использовать (\h|\v) (в форме строки C++ это "(\\h|\\v)"), используя специальные классы «горизонтальное пространство» и «вертикальное пространство» PCRE.

Смежные вопросы