Perl регулярное выражение, предназначенное для добавления косой черты, если ее нет, удваивает существующую косую черту - PullRequest
3 голосов
/ 20 февраля 2012

В исходном коде, который я должен прочитать (не от меня), я нашел регулярное выражение, которое не работает должным образом (или, по крайней мере, с тем, что он делает, код не делает то, что должен).

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

Итак, поехали:

$string =~ s/\/*$/\//g; # Add a trailing slash

Я прочитал это как «найти любое количество косых черт в конце строки (включая 0) и заменить их одной косой чертой». Но это не то, что происходит.

Регулярное выражение удваивает / несколько существующих конечных слешей. Таким образом, я получаю две косые черты, если уже есть одна или несколько. Если его нет, я получаю его (как было бы задумано).

Я могу воспроизвести его, например, с помощью Regex tester . Просто введите http://example.com/foo/ (и измените его в зависимости от количества слешей в конце) в верхнем поле, во втором - регулярное выражение, / / ​​в качестве шаблона замены и нажмите «отправить».

Кажется, что оно вращается вокруг регулярного выражения, также заменяя «ничто» (или конец строки?) Косой чертой (так что оно заменяет «ничто» одной косой чертой, а существующее косое черта - одной косой чертой, которая компенсирует две косые черты, которые я см ...).

Я использовал

$string =~ s/\/{1,0}$/\//g; # Add a trailing slash

также, но это работает, только если в начале есть хотя бы один слеш.

EDIT

На всякий случай, если кому-то интересно:

$string =~ s/\/*\z/\//g; # Add a trailing slash

производит то же самое.

А вот прямая ссылка на тестовую страницу

1 Ответ

5 голосов
/ 20 февраля 2012

Проблема в модификаторе /g, который говорит, чтобы заменить все вхождения.Когда у вас есть косая черта в конце строки, Perl делает две замены.Во-первых, он заменяет косую черту на другую.Затем (поскольку $ является утверждением нулевой ширины и не использует никаких символов), он заменяет пустую строку в конце косой чертой.Удалите /g, и оно будет работать, потому что будет заменено только первое совпадение:

$string =~ s!/*$!/!; # Add a trailing slash

(Я также изменил разделитель, чтобы сделать его более читабельным, хотя это не имеет никакого отношения к вашей проблеме.)

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