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