2017-01-26 4 views
1

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

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

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

Может 'рекс (" ([^ _] *) _ (\ \ d + \\. \\ d +) _ (\\ d + \\. \\ d +) ")' будет работать так, как вам нужно? Или даже 'rex ("^([^ _] *) _ (\\ d + \\. \\ d +) _ (\\ d + \\. \\ d +) ")', если вам нужно совпадение с начала Струна. –

ответ

2

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

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

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

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

0

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

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

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

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

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

Надежда, что помогает

0

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

QRegExp rex("(.*)(\\d+\\.\\d+)_(\\d+\\.\\d+)(\\D.*|$)"); 
rex.setMinimal(true);