我想匹配路径,如/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. 正则表达式匹配目录然后匹配子目录
- 2. 包含某些目录路径的PERL正则表达式匹配行
- 3. 在Perl中匹配正则表达式
- 4. 正则表达式匹配目录路径并忽略文件路径
- 5. 路径目录的正则表达式
- 6. perl中的正则表达式匹配
- 7. 匹配模式:正则表达式 - perl
- 8. 正则表达式中sed来匹配路径的子路径与捕获组
- 9. 如何使用Perl正则表达式来修改长路径
- 10. 正则表达式匹配子目录,但不匹配父目录
- 11. 正则表达式帮助:匹配路径(使用django)
- 12. 正则表达式匹配任何子目录
- 13. Java正则表达式:如何匹配URL路径?
- 14. 如何在Erlang中使用正则表达式匹配正则表达式?
- 15. 的Perl:正则表达式匹配
- 16. perl正则表达式匹配失败
- 17. Perl正则表达式不匹配
- 18. Perl正则表达式匹配
- 19. perl正则表达式匹配问题
- 20. Perl不匹配正则表达式?
- 21. Perl正则表达式匹配
- 22. Perl正则表达式匹配号
- 23. perl正则表达式数字匹配
- 24. Perl的正则表达式匹配不
- 25. Perl正则表达式不匹配
- 26. 与perl匹配正则表达式
- 27. Perl正则表达式匹配
- 28. perl正则表达式匹配多行
- 29. 打印Perl正则表达式匹配
- 30. Perl正则表达式匹配数字
+1谢谢,这个工程,但我想要一个正则表达式(我用这一堆其他测试)。 – 2010-09-12 11:54:32
@David:正则表达式不是这里最好的选择 - File :: Basename是为了处理文件名解析中的混乱边缘情况而编写的。应该没有理由不能将其与其他测试结合使用。 – Ether 2010-09-12 16:44:18