这个正则表达式有什么问题/ ^([^ - ] *)( - *。)?/?

时间:2014-12-04 10:24:33

标签: regex perl

考虑一下:

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-

我已经尝试了上面的正则表达式,最后一个是最接近但不完全的。猜测也没有工作,令人惊讶......当然我可以修剪结果,但必须有更优雅的方式?

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您可以将此正则表达式用于匹配:

/^([^-]+)(?=\s-|$)/

RegEx Demo

(?=\s-|$)是一个预测,可以确保第一部分([^-]+)后面跟着空格+连字符输入结尾

答案 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;