Почему сканирование строки не находит все совпадения? - PullRequest
0 голосов
/ 29 октября 2009

Давайте использовать это как пример данных:

text=<<EOF
#if A==20
        int b = 20;
#else
        int c = 30;
#endif

И этот код:

puts text.scan(/\#.*?\#/m)

Почему это только захватывает это:

#if A==20
    int b = 20;
#

Я ожидал, что это совпадет также:

#else
    int c = 30;
#

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

Ответы [ 3 ]

2 голосов
/ 29 октября 2009

Это не соответствует второй части, потому что "#" до того, как остальное уже было использовано, поэтому все, что осталось, это

else
    int c = 30;
#

, который не соответствует шаблону. Вы можете исправить это, используя lookahead для сопоставления со вторым #, не потребляя его:

text.scan(/#.*?(?=#)/m)
1 голос
/ 29 октября 2009

Второй # в вашем входе уже соответствует первой найденной подстроке scan. Оттуда он продолжает сканировать оставшуюся часть строки, которая:

else
        int c = 30;
#endif

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

0 голосов
/ 29 октября 2009

.*? находит самое короткое совпадение. Попробуйте просто .*.

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