Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 匹配图像文件相对路径的正确正则表达式是什么?_Perl - Fatal编程技术网

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

Perl 匹配图像文件相对路径的正确正则表达式是什么?,perl,Perl,我有这个路径。/../Capture.jpg。到目前为止,我已经找出了这个不完整的正则表达式:'[../]+'。我想检查用户是否输入了正确的路径,如。/../image file name。文件扩展名可以是jpg、png、…如果不关心路径前缀,请使用: $path=~/\(jpg|png)$/ 或 substr($path,-4)~~['.jpg','.png'] 使用“../../”,请使用: $path=~m!^\./\.\/[^/]*\(巴布亚新几内亚)$ 使用任意数量的“../”时,请使

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

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

使用“../../”,请使用:
$path=~m!^\./\.\/[^/]*\(巴布亚新几内亚)$

使用任意数量的“../”时,请使用:
$path=~m^(\.\./)*[^/]*\.(巴布亚新几内亚)$

如果您确实希望在文件名开头匹配一组../的话,您的[../]+对于手头的作业来说是不够的或不正确的

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

    /^((?:\.\.\/)+)/
基本上:

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

(和平衡)结束时:捕获其中的内容。您的所有.././将在名为$1的变量中可用

然后我使用(?:)包装下一个内容。这会将位分组,但不会将值保存在$1、$2等中。稍后将提供更多信息

真正的兴趣模式是

    \.\.\/
自从。和/是魔法角色,它们需要用反斜杠“转义”。这告诉Perl。和/或在这一点上没有特殊意义

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

因此,我的模式将匹配一个或多个固定到字符串开头的../重复。此外,如果你有兴趣做一些与之匹配的事情,那么匹配的确切内容将以1美元的价格提供(例如,数一数你有多少…/你有多少)

如果您还有其他问题,或者我误解了您的目标,请询问

编辑:为了满足您的新需求,并增加一点额外奖励:

    m!^\.\./\.\./(([^/]+)\.([^.]+))$!
首先请注意,我使用了m!图案而不是/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";
    }
作为奖励,我甚至测试了它,发现了两个你永远不会看到的spolling mistaiks


干杯。

我要删除smartmatch,它会在较新的perl版本中产生一个
实验性的
警告。如果你想使用它,拿一个模块。为什么不使用
qw
?列表中只有两项。如果有4项或更多项,我通常使用
qw()
,如果只有1项,则使用
('..')
。如果有2个或3个项目,我会使用
qw()
('..')
ramdomly。我看不出为什么我必须选择一个而不是另一个。你是否因为我使用了
~
'
而否决了我的答案?别这样,他们还是正确答案^^|事实上,我投了反对票只是因为
~
,因为这会产生一个警告。另一个只是一个风格问题,我不会因此而投票。你认为什么是“正确的道路”?现有文件?只是随机路径匹配您的FS规格?现有目录?虽然欢迎使用此代码片段,并可能提供一些帮助,但它将说明如何以及为什么解决此问题。记住,你是在将来回答读者的问题,而不仅仅是现在提问的人!请在回答中添加解释,并说明适用的限制和假设。
# convert relative file paths to md links ... 
# file paths and names with letters , nums - and _ s supported
$str =~ s! (\.\.\/([a-zA-Z0-9_\-\/\\]*)[\/\\]([a-zA-Z0-9_\-]*)\.([a-zA-Z0-9]*)) ! [$3]($1) !gm