"нетерпеливое" соответствие регулярному выражению - PullRequest
14 голосов
/ 28 марта 2011

Я должен удалить строку между двумя разделителями, т.е. Из "123XabcX321" я хочу "123321". Для простого случая, я в порядке с:

$_=<>;
s/X(.*)X//;
print;

Но если во входных данных, таких как "123XabcXasdfjXasdX321", есть неоднозначность, то это соответствует первому X с последним X, и я получаю "123321", но я хочу "123asdfj321". Есть ли способ указать «нетерпеливое» совпадение, которое соответствует первому допустимому возможному разделителю, а не последнему?

Ответы [ 2 ]

33 голосов
/ 28 марта 2011

Обычно это называется "неуклюжий", вы положили?после квантификатора: s/X(.*?)X//;

6 голосов
/ 28 марта 2011

Избегайте не жадного модификатора, как что-либо, кроме подсказки производительности, если можете.Его использование может привести к «неожиданным» результатам, потому что добавление ? на самом деле не мешает .* сопоставлять что-либо.Например,

$ perl -le'print for "XaXbXY" =~ /X(.*?)XY/;'
aXb

Чтобы избежать совпадения X, вы можете использовать следующее:

s/X[^X]*X//g;

Если X действительно больше, чем один символ, выможно использовать следующее:

s/X(?:(?!X).)*X//g;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...