找不到 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-]");
将这三个字符串与一些测试字符串进行匹配,尤其是字符串 "-"
,您会发现它们的行为都相同。当然编译器警告除外。
正如问题所暗示的那样,我有一个代码片段,带有 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-]");
将这三个字符串与一些测试字符串进行匹配,尤其是字符串 "-"
,您会发现它们的行为都相同。当然编译器警告除外。