Почему это регулярное выражение не совпадает?
Почему следующий код не совпадает? Выражение не так сложно, и онлайн тестер регулярных выражений также заявляет, что он должен работать. Я делаю что-то не так с побегами?
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);