考虑一下:
my @str = ("Farbkeil","L 0AA61 Rec","L 0AA61 Rec - 150 dpi",,"L 0AA61 Rec - 400 dpi");
for my $s (@str) {
# my ($m) = ($s =~ /^([^-]*)(?=-)/);
# my ($m) = ($s =~ /^([^-]*) (?=-)/);
my ($m) = ($s =~ /^([^-]*)( - *.)?/);
print "$s => -$m-\n";
}
它产生此输出
Farbkeil => -Farbkeil-
L 0AA61 Rec => -L 0AA61 Rec-
L 0AA61 Rec - 150 dpi => -L 0AA61 Rec -
L 0AA61 Rec - 400 dpi => -L 0AA61 Rec -
我想要的是在可选" - "之前摆脱空间,以便它看起来像
Farbkeil => -Farbkeil-
L 0AA61 Rec => -L 0AA61 Rec-
L 0AA61 Rec - 150 dpi => -L 0AA61 Rec-
L 0AA61 Rec - 400 dpi => -L 0AA61 Rec-
我已经尝试了上面的正则表达式,最后一个是最接近但不完全的。猜测也没有工作,令人惊讶......当然我可以修剪结果,但必须有更优雅的方式?
有什么想法吗?
答案 0 :(得分:2)
答案 1 :(得分:2)
另一个。仅仅因为它只需要对您的初始正则表达式进行一次小的更改。 (注意圆括号外的\b
)。 \b
用于字边界。
my @str = ("Farbkeil","L 0AA61 Rec","L 0AA61 Rec - 150 dpi",,"L 0AA61 Rec - 400 dpi");
for my $s (@str) {
my ($m) = ($s =~ /^([^-]*)\b(-)?/);
print "$s => -$m-\n";
}
至于为什么你的正则表达式失败了:
([^-]*)
贪婪地匹配非-
的所有内容。因此,它总是匹配尾随空格,如果它在那里。 \b
强制停止并且可以匹配其他空间或行尾。
答案 2 :(得分:1)
我只是删除/ - .*/
for my $s (@str) {
(my $m = $s) =~ s/ - .*//;
print "$s => [$m]\n";
}
在最近的Perls中,您可以使用/r
:
my $m = $s =~ s/ - .*//r;