Не могу найти объяснение поведению QRegularExpression. Это работает, но это не должно - PullRequest
0 голосов
/ 30 января 2020

Поскольку вопрос подразумевает, что у меня есть фрагмент кода с QRegularExpression, который работает. Он делает то, что должен, не вызывает ошибок и все в порядке.

Почему я пишу вопрос? Ну, все, что я нашел до сих пор, подразумевает, что мое выражение не должно работать, но ..... оно работает.

Главный вопрос моего вопроса заключается в \- escape sybmol.

Я знаю, знаю, что это не определено. И во время компиляции я получаю warning: unknown escape sequence: '\-'. И это предупреждение на самом деле ожидается.

Теперь рассмотрим следующий фрагмент кода. Не обращайте слишком много внимания на выражение, оно русское, но, к сожалению, я заметил эту странную вещь в этом выражении.

Я не публикую больше ничего, потому что, как бы странно это ни звучало - это работает, как хотелось бы.

Я действительно хочу понять, почему - учитывая, что я получаю предупреждение.

Выражение ниже.

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

Как я уже сказал, я получаю желаемое поведение. В русских словах с символом «-» символ фактически сожран частью [а-я\-]+. Если его там нет - - не сожрал.

Все, что я нашел, говорит о том, что оно не должно работать, но оно работает.

ОБНОВЛЕНИЕ

В предложенном дубликате Regex не работал.

В моем вопросе четко сказано, что мой regex работает, я просто не мог понять, почему он работал так, как хотелось бы, учитывая предупреждение, которое я получил во время компиляции. Весь предоставленный код использовался как есть и работал.

Более того, вопрос не имеет ничего общего с std :: regex, также ниже был дан правильный ответ на вопрос с правильным объяснением.

Вопрос может быть дубликатом, но он, безусловно, не является дубликатом предложенного вопроса.

1 Ответ

0 голосов
/ 30 января 2020

Компилятор не знает escape-последовательность \-. Таким образом, он просто помещает в строку простое - и выдает предупреждение.

Таким образом, ваш механизм регулярных выражений видит [а-я-]. И то, как работают группы символов регулярных выражений, - в самом конце группы не является особенным, то есть нет никакой разницы между [а-я\-] и [а-я-].

Таким образом, выражение работает так, как вы хотите.

Вы можете попробовать это сами, составив небольшую программу, которая сравнивает результаты для этих двух выражений. Т.е.

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

Сопоставьте эти три с несколькими тестовыми строками, в частности со строкой "-", и вы обнаружите, что все они ведут себя одинаково. За исключением предупреждения компилятора, конечно.

...