如何在Perl中使用正则表达式匹配子目录路径?
我想匹配路径,如/this/is/my/dir/name/anything
但不是/this/is/my/dir/name/anything/anything2
。换句话说,我想匹配``/ this/is/my/dir/name /`下的第一层上的所有文件和子目录,而不是较低层上的任何内容。如何在Perl中使用正则表达式匹配子目录路径?
您可以使用dirname
功能从File::Basename
:
dirname($path) eq '/this/is/my/dir/name' or warn "No match";
UPD:如果你喜欢使用正则表达式:
my $dirname = '/this/is/my/dir/name';
$path =~ m|^$dirname/[^/]+/?$| or warn "No match";
斜杠存在问题的默认分隔符,你风与leaning toothpick problem。幸运的是,Perl 5允许您选择自己的分隔符,如果您使用一般形式:m//
。既然你想整个字符串,而不只是一个子串的匹配,你将要使用指定start of string (^
) and end of string ($
)主播:
if ($dirname =~ m{^/this/is/my/dir/name/anything$}) {
}
注:^
和$
锚由/m
modifier(他们改变意味着开始影响和行结束)。如果您打算使用/m
修饰符,则可能需要使用\A
(start of string) and \Z
(end of string or before a newline at the end of the string) or \z
(end of string) assertions。
+1谢谢,这很有用!我明白'm'后的表达式可以用'{}'或'||'或'//'括起来吗? – 2010-09-12 13:46:59
@大卫B:是的。不记得官方说明,但[这个也解释](http://perldoc.perl.org/perlop.html#Gory-details-of-parsing-quoted-constructs)。 – Dummy00001 2010-09-12 13:59:58
@David B在Perl 5中,您可以选择任何分隔符,但可以使用空格字符。有四个包围分隔符集:'[]','{}','()'和''。在所有其他情况下,您可以使用这种'm#regex#'或#s#regex#string#'这样的字符。分隔符'''也是特殊的。它将构造变成它自己的非插值版本。 – 2010-09-12 14:22:46
+1谢谢,这个工程,但我想要一个正则表达式(我用这一堆其他测试)。 – 2010-09-12 11:54:32
@David:正则表达式不是这里最好的选择 - File :: Basename是为了处理文件名解析中的混乱边缘情况而编写的。应该没有理由不能将其与其他测试结合使用。 – Ether 2010-09-12 16:44:18