Я пытаюсь использовать Perl или MATLAB для анализа нескольких чисел из одной строки текста. Моя текстовая строка:Совпадение шаблона раздвижного окна в регулярных выражениях perl или matlab
t10_t20_t30_t40_
сейчас в MATLAB, я использовал следующий сценарий
str = 't10_t20_t30_t40_';
a = regexp(str,'t(\d+)_t(\d+)','match')
и возвращает
a =
't10_t20' 't30_t40'
То, что я хочу, чтобы она также возвращает ' t20_t30 ', так как это, очевидно, совпадение. Почему regexp не сканирует его?
Таким образом, я обратился к Perl, и написал следующее в Perl:
#!/usr/bin/perl -w
$str = "t10_t20_t30_t40_";
while($str =~ /(t\d+_t\d+)/g)
{
print "$1\n";
}
и результат такой же, как MATLAB
t10_t20
t30_t40
, но я действительно хотел «t20_t30» также быть в Результаты.
Может ли кто-нибудь сказать мне, как это сделать? Благодаря!
[обновление с помощью решения]: С помощью коллег я определил решение, используя так называемое «утверждение обхода», предоставляемое Perl.
#!/usr/bin/perl -w
$str = "t10_t20_t30_t40_";
while($str =~ m/(?=(t\d+_t\d+))/g)
{print "$1\n";}
Ключом является использование «утверждения с нулевой шириной взгляда» в Perl. Когда Perl (и другие подобные пакеты) использует regexp для сканирования строки, он не пересканирует то, что уже было проверено в последнем матче. Таким образом, в приведенном выше примере t20_t30 никогда не будет отображаться в результатах. Чтобы зафиксировать это, нам нужно использовать поиск с нулевой шириной для сканирования строки, создавая совпадения, которые не исключают подстроки из последующих поисков (см. Рабочий код выше). Поиск начнется с нулевой позиции и увеличивается на один раз, насколько это возможно, если к поиску (т. Е. M // g) добавляется модификатор «global», что делает его «жадным» поиском.
Это объясняется более подробно в this blog post.
Выражение (? = T \ d + _t \ d +) соответствует любой строке ширины 0, за которой следует t \ d + _t \ d +, и это создает фактическое «скользящее окно». Это эффективно возвращает ВСЕ t \ d + _t \ d + шаблоны в $ str без исключения, поскольку каждая позиция в $ str является строкой шириной 0. Дополнительная скобка фиксирует рисунок при выполнении скользящего совпадения (? = (T \ d + _t \ d +)) и, таким образом, возвращает желаемый результат скользящего окна.
Это хорошее решение, но моя репутация слишком низкая на сайте, что я не могу его проголосовать ... извините –