匹配图像文件的相对路径的正确正则表达式是什么?

时间:2014-11-16 04:54:39

标签: perl

我有这条路径../../Capture.jpg。到目前为止,我已经找到了这个不完整的正则表达式:' [../] +'。我想检查用户是否放入了../../image file name这样的正确路径。文件扩展名可以是jpg,png,..

2 个答案:

答案 0 :(得分:1)

如果您真的想在文件名的开头匹配一堆../,那么[.../] +对于手头的工作来说是不够的或正确的。

目前还不完全清楚你想要做什么,但以下内容将匹配字符串开头的一个或多个../:

    /^((?:\.\.\/)+)/

基本上是:

^锚定到正在测试的字符串的开头 - 将不匹配任何../ INSIDE字符串

最后的

(和平衡):捕获内部的内容。您所有的../../都将在名为$ 1

的变量中提供

然后我用(?:)来包装下一个内容。这会将内部分组,但不会将值保存在$ 1,$ 2等内。更多信息很快就会......

感兴趣的真实模式是

    \.\.\/

从那以后。和/是魔术角色,他们需要用反斜杠“逃避”。这告诉Perl那个。和/此时没有特殊含义。

我已经使用(?:)包装器将它们组合在一起,以便+对所有感兴趣的3个字符进行操作。 +运算符表示“一次或多次重复”。

因此,我的模式将匹配一个或多个重复的../,它们锚定在字符串的开头。此外,如果您有兴趣做一些事情(例如,计算您有多少../),匹配的确切内容将以1美元的价格提供。

请询问您是否有其他问题,或者我误解了您的目标。

编辑:为了满足您的新要求,并添加一些奖励:

    m!^\.\./\.\./(([^/]+)\.([^.]+))$!

首先请注意我使用了m!pattern!而不是/ pattern /。首先,如果Perl看到/ pattern /它假定它是m / pattern /但你可以使用另一个字符来包装模式。如果您真的想在模式中使用/而不必使用反斜杠,那么这很有用。

这样:

^仅从开头

完全匹配

紧接着是../../

接下来我使用()包装器来捕获后面的位。 ......之后的解释

忽略(和)现在:

[^ /] +任何不是/

的字符的一个或多个重复(+)

。字面上是一个点 - 扩展前的那个

[^。/] +任何不是的任何字符的一次或多次重复。或/

注意[^ /] +如何允许任何字符,包括。但是防止另一个目录部分潜入。因此,文件名可以是foo.bar.jpg,它将被正确收集。

注意[^。/] +如何允许除了点之外的扩展名中的任何字符 - 并且还要排除/以防止另一个目录段潜入。

最后,$用于确保我们已达到模式的末尾。

至于捕获:

$ 1将包含所有foo.bar.jpg

$ 2将包含foo.bar

3美元将包含jpg(不是.jpg),但是如果你想捕获点,我还会告诉你要弄清楚要改变什么。

最后 - 在典型的脚本中,您可以执行以下操作:

    if($filename =~ m!^\.\./\.\./(([^/]+)\.([^./]+))$!) {
        print "You correctly entered ../../$1 giving basename=$2 and extension=$3 - Bravo!\n";
    }
    else {
        print "you've failed to read the instructions properly\n";
    }

作为奖励,我甚至对此进行了测试,并发现了2个你永远不会看到的嬉闹的蠢事

欢呼声。

答案 1 :(得分:-1)

如果您不关心路径前缀,请使用:   $path =~ /\.(jpg|png)$/ 要么   substr($path, -4) ~~ ['.jpg', '.png']

正好用'../../',使用:   $path =~ m!^\.\./\.\./[^/]*\.(jpg|png)$!

使用任意数量的'../,使用:   $path =~ m!^(\.\./)*[^/]*\.(jpg|png)$!