2012-02-28 58 views
0

我知道正则表达式可以使用,但无法找到正确的表达式。也有任何可用的内置函数吗?如何匹配unix绝对路径并使用perl提取它?

+0

你能更清楚地解释一下你想要的吗?究竟你想匹配和提取什么?你可以给一些你想要匹配的输入字符串吗?不匹配,以及你在输出什么? – 2012-02-28 06:30:34

+1

不是没有一些额外的限制,他们不能。现代* nix路径可以包含除'\ 0'之外的任何字符。意思是,如果你愿意,你可以有一条看起来像一个句子的路径。绝对路径名是唯一可以实现的功能,它是一个主要的斜线。 – cHao 2012-02-28 06:30:35

+0

“bmake:停在/ bb/cc/xx/yy/zz/aa”。从这里我只是想提取/ bb/cc/xx/yy/zz/aa – 2012-02-28 06:35:54

回答

2

考虑:

bmake: stopped in /bb/cc/xx/yy/zz/aa 

此正则表达式将拉动路径:

m%\s(/.*)% 

它看起来的空格字符后跟一个斜线跟着什么。如果你没有在你的路径名的空白,那么你可以使用更严格的:

m%\s(/\S*)% 

如果你相信你会一直有一个或多个路径组件的名称,你可以添加更多限制:

m%\s(/\S+/\S*)% 

然后继续。您对路径中的有效内容了解得越多,您匹配文件名的机会就越大。但是请注意,Unix上的文件名可以包含除/(因为它是路径名的各部分之间的分隔符)和\0(NUL字节)之外的任何字符。其他一切 - 换行符,制表符,控件等 - 都是公平的游戏,可能是文件名的一部分。实际上,它们中的大多数通常不存在于文件名中。

请注意,相对路径名比绝对路径名更难。

1

/(.+/)*.*使用此模式。一开始就有斜线,然后是目录(可能不是任何),最后是文件名或目录名(这可能不是太完美)。实际上,这将匹配所有以斜线开头的东西,但这是可以的,因为unix中的路径可以包含除\0之外的所有内容。

+0

在Perl中,我必须这样做吗? $ line =〜m/regex/?? – 2012-02-28 06:37:08

+0

yes.see this http://www.troubleshooters.com/codecorn/littperl/perlreg.htm – shift66 2012-02-28 06:38:17

+0

if($ line =〜/[/](.+[/])*.*/),这是否正确? – 2012-02-28 06:43:12

4

我建议使用File::Spec核心模块来代替。如果您只需要检查给予您的是绝对路径,请使用file_name_is_absolute();如果您需要将相对路径转换为绝对路径,请使用rel2abs(),您会看到该模式。 )它更容易和更可读。

相关问题