【问题标题】:What's wrong with this regex /^([^-]*)( - *.)?/?这个正则表达式有什么问题 /^([^-]*)( - *.)?/?
【发布时间】:2014-12-04 18:56:35
【问题描述】:

考虑一下:

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-

我已经尝试过上面的正则表达式,最后一个是最接近但不完全的。猜测也没有用,出乎意料...当然我可以只修剪结果,但必须有更优雅的方式?

有什么想法吗?

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    您可以使用此正则表达式进行匹配:

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

    RegEx Demo

    (?=\s-|$) 是一个前瞻,确保第一部分 ([^-]+) 后面总是跟着 空格 + 连字符输入结束

    【讨论】:

    • 不错。我没有想到使用交替。
    【解决方案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 强制停止,并且可以匹配空格或行尾。

    【讨论】:

    • 我喜欢那个……它完全符合我的意思,但没能做到!在此示例中,如果没有 ( - ),它的工作原理相同吗?部分。
    【解决方案3】:

    我只是删除/ - .*/

    for my $s (@str) {
        (my $m = $s) =~ s/ - .*//;
        print "$s => [$m]\n";
    }
    

    在较新的 Perls 中,您可以使用 /r:

    my $m = $s =~ s/ - .*//r;
    

    【讨论】:

    • 好的,替换而不是匹配。为什么我没有想到呢?谢谢。
    • 我会接受你的答案,因为它是解决问题的最短方法,我最终使用它而不是我相当复杂的方法(这是我使用它的旧版本代码的遗产。 ..).
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多