【问题标题】:Why doesn't this perl regex capture the last character?为什么这个 perl 正则表达式不捕获最后一个字符?
【发布时间】:2011-03-13 04:20:13
【问题描述】:

让 $PWD = /Unix_Volume/Users/a/b/c/d

我希望:

echo $PWD | perl -ne 'if( /(\w+)[^\/]/ ){ print $1; }'

显示“Unix_Volume”。但是,它显示“Unix_Volum”。为什么正则表达式不捕获最后一个字符?

【问题讨论】:

  • 我想取消这个问题。 use Path::Class; (file '/Unix_Volume/Users/a/b/c/d')->parent->dir_list; 返回('', qw(Unix_Volume Users a b c))

标签: regex perl


【解决方案1】:

(\w+) => Unix_Volum

[^\/] => e(不是 /)

/ => /

【讨论】:

  • +1,打败我。 [^\/] 强制它在到达 / 之前再捕获一个字符。
【解决方案2】:

试试:

export PWD=/Unix_Volume/Users/a/b/c/d
perl -MFile::Spec -e'print((File::Spec->splitdir($ENV{_pwd}))[1],"\n")'

您应该尽可能使用 Perl 附带的模块。有关它们的列表,请参阅perldoc perlmodlib

【讨论】:

    【解决方案3】:

    既然 \w 在其类中没有正斜杠,为什么需要 [^\/] ?

    /(\w+)/ 可以。它捕获了这个类的第一次

    edit:/.*\b(\w+)/ 以捕获最后一次出现。

    【讨论】:

      【解决方案4】:

      (\w+)group 贪婪地匹配并捕获单词字符“Unix_Volume”,将位置留在“Unix_Volume”之后的 / 处。

      [^\/] 类强制引擎备份(贪婪的+ 量词放弃匹配的字符以满足其后的原子)匹配不是“/”的字符,匹配“e” “Unix_Volume”的结尾。由于匹配的“e”在捕获组之外,因此您在 $1 中留下了“Unix_Volum”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-15
        • 1970-01-01
        • 1970-01-01
        • 2013-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多