-1

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

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

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

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

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

我没有发布任何其他内容,因为听起来很奇怪 - 它可以按需要工作。

我实际上想了解原因 - 考虑到我收到警告。

表达式如下。

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

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

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

更新

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

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

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

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

4

1 回答 1

0

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

您的正则表达式引擎因此看到[а-я-]. 并且正则表达式字符组的工作方式,组末尾的 a并不特殊,即and-之间没有区别。[а-я\-][а-я-]

因此,表达式按您的意愿工作。

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

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

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

于 2020-01-30T11:37:21.497 回答