Почему это регулярное выражение не совпадает?

Почему следующий код не совпадает? Выражение не так сложно, и онлайн тестер регулярных выражений также заявляет, что он должен работать. Я делаю что-то не так с побегами?

  QRegExp rex("(.*?)(\\d+\\.\\d+)_(\\d+\\.\\d+).*?");
  QString fileName("tile_10.0000_47.3100_0.1_.dat");

  if (rex.indexIn(fileName)>=0) {
    // ...
  }

3 ответа

Решение

QRegExp не поддерживает ленивые квантификаторы, поэтому *? здесь не работает Так же .*? в конце шаблона не совпадает ни один текст, его можно смело удалять.

Предлагаю заменить первый .*? с ([^_]*)_ шаблон (0+ символов кроме _ и _ сразу после них) чтобы добраться до первого digits.digits текст:

rex("([^_]*)_(\\d+\\.\\d+)_(\\d+\\.\\d+)")

Или, если вам нужно сопоставить данные с начала строки, добавьте шаблон с ^ (начало строки).

Одно возможное изменение может быть:

(.*?)(\d+\.\d+)_(\d+\.\d+)_(\d+\.\d+)_\..*

Который очень строг к вашему примеру.

А здесь тот, который принимает любую последовательность чисел с последующим подчеркиванием до расширения файла.

(.*?)((\d+\.\d+)_+)\..*

надеюсь, это поможет

Вы также можете изменить поведение квантификаторов с помощью QRegExp.setMinimal() сделать их нежадными по умолчанию и с небольшим изменением шаблона:

QRegExp rex("(.*)(\\d+\\.\\d+)_(\\d+\\.\\d+)(\\D.*|$)");
rex.setMinimal(true);
Другие вопросы по тегам