Perl регулярное выражение для подстановки переменных - PullRequest
0 голосов
/ 24 апреля 2018

Я хочу заменить переменные, помеченные знаком "#" и оканчивающиеся точкой или не алфавитно-цифровым символом. Пример: переменная #name должна быть заменена на "Peter"

abc#name.def => abcPeterdef
abc#namedef  => abc#namedef
abc#name-def => abcPeter-def

Таким образом, если переменная оканчивается точкой, она заменяется, а точка удаляется. Завершается ли он каким-либо не алфавитным символом, он также заменяется.

Я использую следующее:

s/#name\./Peter/i
s/#name(\W)/Peter$1/i

Это работает, но возможно ли объединить его в одно выражение?

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Существует несколько возможных подходов.

s/#name(\W)/"Peter" . ($1 eq "." ? "" : $1)/e

Здесь мы используем /e, чтобы превратить заменяющую часть в выражение, чтобы мы могли проверить $1 и выбрать строку замены динамически.

s/#name(?|\.()|([^.\w]))/Peter$1/

Здесь мы используем (?| ) для сброса нумерации групп захвата между ветвями, поэтому для \.() и ([^.\w]) устанавливается $1.Если . соответствует, $1 становится пустой строкой;в противном случае он содержит соответствующий символ.

0 голосов
/ 25 апреля 2018

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

Как это

s/#name(?:\.|\b)/Peter/i

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

use strict;
use warnings 'all';

for my $s ( 'abc#name.def', 'abc#namedef', 'abc#name-def' ) {

    ( my $s2 = $s ) =~ s/#name(?:\.|\b)/Peter/i;

    printf "%-12s => %-s\n", $s, $s2;
}

выход

abc#name.def => abcPeterdef
abc#namedef  => abc#namedef
abc#name-def => abcPeter-def
0 голосов
/ 24 апреля 2018

Вы можете использовать

s/#name(?|\.()|(\W))/Peter$1/i

Детали

  • #name - соответствует литеральной подстроке
  • (?|\.()|(\W)) - группа сброса ветви , соответствующая любой из двух альтернатив:
    • \.() - точка и затем захватывает пустую строку в $1
    • | - или
    • (\W) - любой несловарный символ, записанный в $1.

Таким образом, при совпадении $1 заполнитель либо пуст, либо содержит любой символ, не являющийся словом, кроме точки.

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