2016-01-11 4 views
1

У меня есть строки следующих строчек: «H-e-l-o-world-guys», поэтому некоторые слова разграничены неверно. Как удалить те черточки только между одиночными символами, а не между словами?Regex fix delimiters в строке

Я попытался это: $words =~ s/-(.)//g;

, но это не сработало.

ответ

2

Это сложнее, чем вы думаете, потому что вы пытаетесь утверждать отрицательный случай ... но затем «держите» этот минус.

Так, чтобы сделать это, вам нужно Осмотреться модификаторы к вашему регулярному выражению:

#!/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 
+0

Спасибо, но это не работает для юникода, как для этого: «Բ-ա-ր-ե-ւ- мировоззрений парней " –

+0

Это совсем другой сценарий, но попробуйте'/u' в качестве модификатора regex. Я думаю, это должно было сделать трюк. – Sobrique

+0

использовать utf8; помог. еще раз спасибо –

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