MATLAB регулярное выражение отклонить совпадение, если возникает условие - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь использовать регулярное выражение MATLAB, чтобы попытаться отфильтровать большой файл данных ASCII. Обычно файл содержит разделенные запятыми записи, содержащие около 15 полей:

$PINS2,234572.485,2017,1493375479,65616,0.6356,-0.0113,-0.0411,-0.7709,-0.119,-0.071,0.030,34.19859875,-118.16703693,297.113*2b

Но иногда у меня есть строки, которые выглядят так:

$PINS2,234572.677,2017,14933,-0.255,-0.534,-9.671*25

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

(?(?@count($1,",")==14)(?<=PINS2)[-,.\s0-9]*(?=*))

как выражение, но оно не работает.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

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

function profFunc()

    n = 10;

    str = repmat("$PINS2,234572.485,2017,1493375479,65616,0.6356,-0.0113,-0.0411,-0.7709,-0.119,-0.071,0.030,34.19859875,-118.16703693,297.113*2b",100000,1);
    str(50) = "$PINS2,234572.677,2017,14933,-0.255,-0.534,-9.671*25";

    str = join(str,newline);

    tic
    for i = 1:n
        result_1 = regexp(str,'(?<=PINS2,)(?=(?:[^,\n]+,){13})[^\n]*(?=*)','match');
    end
    toc

    tic
    for i = 1:n
        result_2 = splitlines(str);
        result_2(count(result_2,',') ~= 14) = [];
    end
    toc
end

>> profFunc
Elapsed time is 7.321635 seconds.
Elapsed time is 0.716751 seconds.

Используемое регулярное выражение отбрасывает '$ PINS2' и '* 2b', которых вы можете достичь с помощью extractBefore и extractAfter, если хотите.

0 голосов
/ 06 сентября 2018

Вы можете использовать следующее выражение:

^(?=(?:[^,]+,){14}).*$
  • ^ Начало строки.
  • (?= Положительный прогноз.
  • (?:[^,]+,){14}Группа без захвата.Соответствует всему, что не является запятой, за которой следует запятая.Группа без захвата сопоставляется 14 раз.
  • ) Завершает поиск.
  • .* Совпадение с чем-либо жадно.
  • $ Утверждение конца строки.

Regexдемо здесь .


MATLAB демо:

Первая строка:

>> str = '$PINS2,234572.485,2017,1493375479,65616,0.6356,-0.0113,-0.0411,-0.7709,-0.119,-0.071,0.030,34.19859875,-118.16703693,297.113*2b'
>> regexp(str,'^(?=(?:[^,]+,){14}).*$','match')
ans =

1×1 cell array

{'$PINS2,234572.485,2017,1493375479,65616,0.6356,-0.0113,-0.0411,-0.7709,-0.119,-0.071,0.030,34.19859875,-118.16703693,297.113*2b'}

Вторая строка:

>> str = '$PINS2,234572.677,2017,14933,-0.255,-0.534,-9.671*25'
>> regexp(str,'^(?=(?:[^,]+,){14}).*$','match')

ans =

  0×0 empty cell array

В качестве альтернативы, вы можете просто проверить, сколько запятых есть в строке и отфильтровать соответственно:

>> str = '$PINS2,234572.485,2017,1493375479,65616,0.6356,-0.0113,-0.0411,-0.7709,-0.119,-0.071,0.030,34.19859875,-118.16703693,297.113*2b'
>> nnz(str == ',')

ans =

    14
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...