我想匹配路径,如/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. 包含某些目录路径的PERL正则表达式匹配行
- 2. 路径目录的正则表达式
- 3. 正则表达式中sed来匹配路径的子路径与捕获组
- 4. 正则表达式匹配子目录,但不匹配父目录
- 5. 正则表达式帮助:匹配路径(使用django)
- 6. 如何在Erlang中使用正则表达式匹配正则表达式?
- 7. perl正则表达式数字匹配
- 8. 的Perl:正则表达式匹配
- 9. Perl正则表达式不匹配
- 10. Perl正则表达式匹配
- 11. perl匹配可选正则表达式
- 12. Perl不匹配正则表达式?
- 13. 正则表达式在JavaScript中匹配SVG路径数据
- 14. 在perl中使用grep与正则表达式匹配
- 15. 在Perl中使用正则表达式的匹配元素
- 16. 使用正则表达式列表查找匹配的目录
- 17. 如何在Perl中进行全局正则表达式匹配?
- 18. 如何在Perl中匹配多个正则表达式?
- 19. 在Perl中匹配正则表达式和另一个正则表达式
- 20. 正则表达式:不匹配的子正则表达式
- 21. 正则表达式 - 从根或根+ 1子目录匹配
- 22. 使用正则表达式的Javascript正则表达式匹配
- 23. 正则表达式以匹配URL中的特定路径段
- 24. Perl:如何匹配正则表达式中的括号?
- 25. 如何迭代Perl中的正则表达式匹配变量?
- 26. 正则表达式:验证子路径
- 27. 如何使PHP匹配正则表达式不匹配在线?
- 28. 正则表达式htaccess匹配模式,除非目录存在
- 29. 在C++中使用boost正则表达式提取子匹配
- 30. 在perl中使用正则表达式匹配检查空间perl
+1谢谢,这个工程,但我想要一个正则表达式(我用这一堆其他测试)。 – 2010-09-12 11:54:32
@David:正则表达式不是这里最好的选择 - File :: Basename是为了处理文件名解析中的混乱边缘情况而编写的。应该没有理由不能将其与其他测试结合使用。 – Ether 2010-09-12 16:44:18