2013-02-08 9 views
1

мне нужно написать регулярное выражение на языке Perl, чтобы преобразоватьPerl Regex заменить только часть строки

site.company.com => dc=site,dc=company,dc=com 

К сожалению, я не в состоянии удалить завершающую «» с помощью регулярных выражений, я пришел с ниже. Я мог бы, конечно, удалить конечный «,» в следующем выражении, но предпочел бы, чтобы это было обработано как часть регулярного выражения.

$data="site.company.com"; 
$data =~ s/([^.]+)\.?/dc=$1,/g; 
print $data; 

Это выше код печатает:

dc=site,dc=company,dc=com, 

Спасибо заранее.

+0

_ "Этот вышеприведенный код печатает: dc = site, dc = company, dc = com," _ Это именно то, что вы хотите, не так ли? – Simon

+0

"dc = site, dc = company, dc = com" - Без трейлинга ',' –

+0

О, да, извините, не обратил на это внимания. – Simon

ответ

2
$data =~s/\./,dc=/g&&s/^/dc=/g; 

испытания ниже:

> echo "site.company.com" | perl -pe 's/\./,dc=/g&&s/^/dc=/g' 
dc=site,dc=company,dc=com 
+0

Ah. +1 для множественной подстановки. Мой вопрос теоретический в том смысле, что я хочу добиться этого с помощью одного выражения regex и без использования замены стиля sed. –

+1

'$ data = ~ s /\./, dc =/g && s/^/dc =/g;' - первая подстановка будет применена к '$ data', а вторая к' $ _'. – TLP

+0

Но как это важно, когда конечный результат - это то, что требуется? И @TLP мне нравится ваше решение. – Vijay

4

При обращении URLs может быть хорошей идеей использовать модуль такой, как URI. Однако я не думаю, что это применимо в этом случае.

Эта задача наиболее легко решается с помощью раскола и присоединиться, я думаю:

my $url = "site.company.com"; 
my $string = join ",",   # join the parts with comma 
      map "dc=$_",   # add the dc= to each part 
      split /\./, $url; # split into parts 
1

Попробуйте сделать это:

my $x = "site.company.com"; 
my @a = split /\./, $x; 
map { s/^/dc=/; } @a; 
print join",", @a; 
0

просто положить, как это,

$data="site.company.com"; 
$data =~ s/,dc=$1/dc=$1/g; #(or) $data =~ s/,dc/dc/g; 
print $data; 
0

I 'собирается попробовать маршрут /ge:

$data =~ s{^|(\.)}{ 
    ($1 && ',') . 'dc=' 
}ge; 

e = оценить замену как код Perl.

Итак, это означает, что с учетом начала строки или точки выполните следующую замену. Если он захватил период, затем испустите ','. Независимо от этого результата, вставьте 'dc='.

Обратите внимание, что я хотел бы использовать стиль рамки для разделителя во всех моих оцененных заменах.

Смежные вопросы