2016-11-29 38 views
0

如果包含的文件夹/结构是否正常,我正在检查perl中的ZIP-Archive。到目前为止,根目录包含一个sourcen目录/sourcen。 RegExp ^sourcen为我做了这件事。正则表达式 - 从根或根+ 1子目录匹配

现在我有一个新的案例。根目录可能包含一个子目录sourcen-DIR之前,所以它可以是这样的:

/sourcen 
/SUBDIR/sourcen 

它可能没有更多然后一个子目录这样的:

/SUBDIR/SUBDIR/sourcen 
/SUBDIR/SUBDIR/SUBDIR/sourcen 
/SUBDIR/SUBDIR/SUBDIR/SUBDIR/sourcen 
... 

是否有可能使用RegExp验证sourcen目录是在根目录下还是只有一个子目录'lower'?

+0

我不想只得到检查字符串的最后部分。我必须在我的sourcen目录存在之前验证在root之后是否有max 1 subdir。伊莫这使它不同,然后只是像寻找文件名一样寻找最后一场比赛。 – Yaerox

回答

4

要检查/sourcen/other/sourcen

$dir =~ m|^/ (?: [^/]+ /)? sourcen|x; 

/x允许的空间内,以提高可读性。使用|代替惯用的/,以便我们可以在模式中使用/而不会转义它。

为了能够通过添加()来判断是哪一种情况捕获了整个事物(或其部分)。


我们开始(^)与/,因为这开始于根。

[^/]+检查任何非/的字符一次或多次(+)。因此,它会匹配第一个字符串/。构造[^...]被称为否定字符类别。看到它in perlretutin perlrecharclass。 然后是字面/,需要与另一个目录。

所有这些都在(?:)内部进行分组,因此可以通过以下?(零次或一次)使其成为可选项。 ?:是在那里,整个格局里面不是通过()捕获,但只有分组。

因此模式(?:[^/]+/)?是可选的第一个目录。

+0

这似乎工作。你能解释这个让我明白吗?我没有得到'(?:[^ /] + /)'的部分。 – Yaerox

+0

@Yaerox添加了解释。我会检查并可能编辑更多,但让我知道如果它不明确。 – zdim

+1

@Yaerox我编辑了很多,并添加了参考。我会暂时离开它,请让我知道如果更多/更好会有用。 – zdim