2015-11-12 3 views
2

Предположим, что у нас есть этот код в MATLAB:Почему regexp MATLAB возвращает только первую строку токена соответствия?

ax = 'aa+bb+cc+dd'; 
middle_part = regexp(ax, '\+(\w+)\+','tokens'); 

Почему MATLAB возвращает только 'bb' в качестве выходного сигнала, а не 'bb' и 'cc'?

+3

Потому что вы потребляете хвост '+'. Используйте lookahead '' \ + (\ w +) (? = \ +) '' –

+0

Из-за совпадающего совпадения. –

+0

@стрибижев. Спасибо за комментарий. Почему эта функция обнаружила только первую строку в моем коде? Можете ли вы описать больше в ответ? – user2991243

ответ

2

Вам нужно поместить второй + в lookahead, чтобы он не потреблялся двигателем регулярных выражений. Here is an answer of mine on how look-aheads work.

Вот фрагмент кода:

ax = 'aa+bb+cc+dd'; 
middle_part = regexp(ax, '\+(\w+)(?=\+)','tokens'); 
disp(middle_part) 

Результат:

{                                         
    [1,1] =                                       
    {                                         
    [1,1] = bb                                      
    }                                         
    [1,2] =                                       
    {                                         
    [1,1] = cc                                      
    }                                         
}   

Так, короче говоря, вот что происходит: \+(\w+)\+ матчи +bb+, и перемещает указатель сразу после + что после bb. Таким образом, существует только cc+dd для тестирования. Не найдено совпадений, поскольку шаблон требует 2 + символов около 1 или более символов слова.

С версией опережения, \+(\w+)(?=\+), двигатель соответствует +bb, которая находится прямо перед + и перемещает указатель сразу после второго b. Строка слева - +cc+dd. Итак, есть еще один матч +cc.

+1

Отличная информация здесь и в связанном посте, спасибо за обмен! – excaza

Смежные вопросы