正则表达式修复字符串中的分隔符

时间:2016-01-11 10:58:01

标签: regex perl

我有一些以下结构的字符串: " H-e-l-o-world-guys",所以有些单词被错误划分。 如何仅在单个字符之间而不是在单词之间删除这些短划线?

我试过这个:$words =~ s/-(.)//g;

但它不起作用。

1 个答案:

答案 0 :(得分: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

编辑:

Բ-ա-ր-ե-ւ-world-guys

情况略有不同。 \w默认情况下不会匹配这些字母,但如果您将/u标记添加到正则表达式中,它应该再次有效。

来自:perlre

  

<强> / U

     

表示在模式匹配时使用Unicode规则。在ASCII平台上,这意味着128到255之间的代码点采用其Latin-1(ISO-8859-1)含义(与Unicode&#39; s相同)。 (否则Perl认为它们的含义是未定义的。)因此,在这个修饰符下,ASCII平台实际上成为了一个Unicode平台;因此,例如,\ w将匹配Unicode中超过100_000个单词字符中的任何一个。

或者选择权宜之计 - [^-]

$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