我有一些以下结构的字符串: " H-e-l-o-world-guys",所以有些单词被错误划分。 如何仅在单个字符之间而不是在单词之间删除这些短划线?
我试过这个:$words =~ s/-(.)//g;
但它不起作用。
答案 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