我通过此正则表达式检查名称的有效性,允许使用任何建议的符号here:
// Allow any symbol
const QString validNameMatcher = QStringLiteral("^[a-zA-Z0-9 _.,!()+=`,\"@$#%*-]+$");
bool Class::isNameValid(const QString fileName)
{
QRegularExpression re(validNameMatcher);
QRegularExpressionMatch match = re.match(fileName);
if (match.hasMatch())
return true;
else
return false;
}
对于1111 Rick (wow) L50-57.stl
这样的文件名,上述函数返回true
。到目前为止一切顺利。
为了允许变音符号,我只是将[À-ž]
添加到名称匹配项,如建议的here:
// [À-ž] is for diacritical marks
const QString validNameMatcher = QStringLiteral("^[a-zA-Z0-9À-ž _.,!()+=`,\"@$#%*-]+$");
[添加[À-ž]
后,令人惊讶的是,对于1111 Rick (wow) L50-57.stl
的相同文件名,上述函数返回false
。我想念什么吗?
根据@WiktorStribiżew的建议,我使用了UseUnicodePropertiesOption
:
QRegularExpression re(validNameMatcher, QRegularExpression::PatternOption::UseUnicodePropertiesOption);
但是它没有用。结果与之前相同。
也(*UTF)
无效:
const QString validNameMatcher = QStringLiteral("(*UTF)^[a-zA-Z0-9À-ž _.,!()+=`,\"@$#%*-]+$");
关键点是使用QRegularExpression::UseUnicodePropertiesOption
选项的@WiktorStribiżew解决方案:
QRegularExpression re(validNameMatcher, QRegularExpression::PatternOption::UseUnicodePropertiesOption);
但正如其documentation所述:
QRegularExpression :: UseUnicodePropertiesOption
\ w,\ d等字符类的含义以及对应字符类(\ W,\ D等)的含义已从匹配的ASCII更改为字符只能匹配具有相应Unicode属性的任何字符。
因此,我想到只用[a-zA-Z0-9À-ž_]
替换正则表达式中的[\w]
:
// Bad:
const QString validNameMatcher = QStringLiteral("^[a-zA-Z0-9À-ž _.,!()+=`,\"@$#%*-]+$");
// Good:
const QString validNameMatcher = QStringLiteral("^[\\w .,!()+=`,\"@$#%*-]+$");
现在,isNameValid()
函数返回预期结果。