正则表达式中的变音符号会导致意外行为

问题描述 投票:0回答:1

我通过此正则表达式检查名称的有效性,允许使用任何建议的符号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À-ž _.,!()+=`,\"@$#%*-]+$");
c++ regex qt diacritics
1个回答
0
投票

关键点是使用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()函数返回预期结果。

© www.soinside.com 2019 - 2024. All rights reserved.