Это сложнее, чем вы думаете, потому что вы пытаетесь утверждать отрицательный случай ... но затем «держите» этот минус.
Так, чтобы сделать это, вам нужно Осмотреться модификаторы к вашему регулярному выражению:
#!/usr/bin/env perl
use strict;
use warnings;
my $str = "H-e-l-o-world-guys";
$str =~ s/(?<=\w)-(\w)(?!\w)/$1/g;
print $str;
Это регулярное выражение распадается как:
#!/usr/bin/env perl
use strict;
use warnings;
my $str = "H-e-l-o-world-guys";
$str =~ s/(?<=\w) #Preceeded by word char
-(\w) #dash, then word-char - capture word char (as $1)
(?!\w) #followed by non word char
/$1/gx; #put that word-char back
print $str;
Примечание - это не якорь в начале строки ,
Это превращает строку в:
Helo-world-guys
Edit:
Բ-ա-ր-ե-ւ-world-guys
несколько иной сценарий. \w
не будет соответствовать этим буквам по умолчанию, но если вы добавите флаг /u
в свое регулярное выражение, он должен работать еще раз.
От: perlre
:
/у
означает использовать правила Unicode при сопоставлении с образцом. На платформах ASCII это означает, что кодовые точки между 128 и 255 принимают значения Latin-1 (ISO-8859-1) (которые совпадают с Unicode). (В противном случае Perl считает, что их значения не определены). Таким образом, под этим модификатором платформа ASCII эффективно становится платформой Unicode; и, следовательно, например, \ w будет соответствовать любому из символов более 100_000 слов в Unicode.
Или пойти на уловку - [^-]
:
$str =~ s/(?<=[^-]) #Preceeded by word char
-([^-]) #dash, then word-char - capture non-dash char (as $1)
(?![^-]) #followed by non word char
/$1/gx; #put that word-char back
Спасибо, но это не работает для юникода, как для этого: «Բ-ա-ր-ե-ւ- мировоззрений парней " –
Это совсем другой сценарий, но попробуйте'/u' в качестве модификатора regex. Я думаю, это должно было сделать трюк. – Sobrique
использовать utf8; помог. еще раз спасибо –