找不到 QRegularExpression 行为的任何解释。它有效,但它不应该

Can't find any explanation for QRegularExpression behavior. It works, but it shouldn't

正如问题所暗示的那样,我有一个代码片段,带有 QRegularExpression,它可以工作。 它做了它应该做的,没有错误,一切都很好。

我为什么要发布这个问题?好吧,到目前为止我发现的所有内容都表明我的表达式不应该起作用,但是......它确实起作用了。

我的问题的重点在于\- escape sybmol。

我知道它没有定义。在编译过程中我得到 warning: unknown escape sequence: '\-'。而这个警告实际上是意料之中的。

现在考虑以下代码片段。不要太在意表情, 它是俄语,但不幸的是我注意到这个表达上有一个奇怪的东西。

我不会发布任何其他内容,因为听起来很奇怪 - 它可以正常工作。

我真的想了解为什么 - 考虑到我收到警告。

表达式如下。

//Capture russian endings
QRegularExpression RU_ENDINGS("([а-я\-]+[бвгджзклмнпрстфхчцшщ])([еиоы][й]|[аия][я]|[иую][ю]|[еиоы][е]|[аоеиы][м][иу]|[ое][г][о]|(?<!ост)и?[аеиоыя]м|ост[а-яё]{1,3}|(?<!остиям)(?>и|ь.?)|[ао]в|н[аеио]|с[ая]|[ео][вк]|[иы]х|[ие]ну|[иуя]т|(?<![аеёиоуыэюя]{2})[аеёоуыэюя]+|и{2})$", QRegularExpression::UseUnicodePropertiesOption | QRegularExpression::MultilineOption);

正如我所说,我得到了想要的行为。 在带有符号“-”的俄语单词中,该符号实际上被 [а-я\-]+ 部分吞噬了。如果它不存在 - - 没有被吞噬。

我发现的一切都表明它不应该起作用,但它确实起作用。

更新

在建议的重复正则表达式中不起作用。

我的问题清楚地表明我的正则表达式有效,考虑到我在编译期间收到的警告,我只是无法弄清楚为什么它能按预期工作。 所有提供的代码都按原样使用并且有效。

更重要的是,这个问题与std::regex无关,而且下面已经给出了正确解释的正确答案。

问题可能重复,但肯定不是建议问题的重复。

编译器不知道转义序列\-。所以它只是在字符串中放置一个简单的 - 并发出警告。

因此您的正则表达式引擎会看到 [а-я-]。而正则表达式字符组的工作方式,组末尾的 - 并不特殊,即 [а-я\-][а-я-].

之间没有区别

因此,表达式可以如您所愿地工作。

您可以编写一个小程序来比较这两个表达式的结果,亲自尝试一下。即

QRegularExpression escaped("[a-z\-]");
QRegularExpression bad_escaped("[a-z\-]");
QRegularExpression unescaped("[a-z-]");

将这三个字符串与一些测试字符串进行匹配,尤其是字符串 "-",您会发现它们的行为都相同。当然编译器警告除外。