我想匹配路徑,如/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