正如问题所暗示的那样,我有一个带有 QRegularExpression 的代码片段,它可以工作。它做了它应该做的事情,没有错误,一切都很好。
为什么我要发布这个问题?好吧,到目前为止我发现的所有内容都暗示我的表达不应该起作用,但是......它确实有效。
我的问题的重点在于\-
逃逸sybmol。
我知道它没有定义。在编译期间我得到
warning: unknown escape sequence: '\-'
. 而这个警告实际上是意料之中的。
现在考虑以下代码片段。不要太在意表情,它是俄语,但不幸的是我注意到这个表情上有这个奇怪的东西。
我没有发布任何其他内容,因为听起来很奇怪 - 它可以按需要工作。
我实际上想了解原因 - 考虑到我收到警告。
表达式如下。
//Capture russian endings
QRegularExpression RU_ENDINGS("([а-я\-]+[бвгджзклмнпрстфхчцшщ])([еиоы][й]|[аия][я]|[иую][ю]|[еиоы][е]|[аоеиы][м][иу]|[ое][г][о]|(?<!ост)и?[аеиоыя]м|ост[а-яё]{1,3}|(?<!остиям)(?>и|ь.?)|[ао]в|н[аеио]|с[ая]|[ео][вк]|[иы]х|[ие]ну|[иуя]т|(?<![аеёиоуыэюя]{2})[аеёоуыэюя]+|и{2})$", QRegularExpression::UseUnicodePropertiesOption | QRegularExpression::MultilineOption);
正如我所说,我得到了想要的行为。在其中带有符号“-”的俄语单词中,该符号实际上是被[а-я\-]+
零件吞噬的。如果它不存在 --
就不会被吞噬。
我发现的一切都表明它不应该起作用,但确实如此。
更新
在建议的重复正则表达式中不起作用。
我的问题清楚地表明我的正则表达式有效,考虑到我在编译期间收到的警告,我只是无法弄清楚为什么它可以按预期工作。所有提供的代码都按原样使用并正常工作。
更重要的是,这个问题与 std::regex 无关,下面也已经给出了正确的答案,并给出了正确的解释。
该问题可能是重复的,但它肯定不是建议问题的重复。