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