我正在尝试重命名一堆图像文件。
它们的名称不一致,但它有一些逻辑
他们都以Id number
在Id
之后可能存在以下某些内容(要移除的项目):
-
对于空格或破折号,它们将以各种顺序出现,有时不止一次出现。
文件名可能包含任何这些项目,但不一定都包含所有项目。
某些文件名确实包含所有3个项目。
在此之后,他们可能会有额外的_
然后他们可能会有number
{Index}
最后,他们以.ext
ext = jpg|png|gif...
以下是一些示例文件名:
我正在尝试删除/替换上述项目,因此文件名如下:
ID.ext
或ID_{index}.ext
所以上面的列表会变成:
我曾尝试写过一些expressions
,但我对这一点感到有点困惑。
我正在开发一个PHP
项目,虽然其他语言可以用于此脚本。
答案 0 :(得分:2)
模式:/^\d+\K[-a-z_ ]+/i
替换:_
(Pattern Demo)
基本上只有在id和索引之间有一个或多个字符时才匹配。简单。
/ #pattern delimiter
^ #start of string
\d+ #one or more digits
\K #restart fullstring match so that the fullstring match is replaced
[-a-z_ ]+ #match one or more hyphens, letters, underscores, or spaces
/ #pattern delimiter
i #make the pattern case-insensitive
代码:(Demo)
$images=['1227.jpg','1227_1.jpg','2200 WH-1.jpg','2200WH 2.jpg','2200 WH2.jpg','2201_BK 1.png','2203 RD_1.jpg'];
var_export(preg_replace('/^\d+\K[-a-z_ ]+/i','_',$images));
输出:
array (
0 => '1227.jpg',
1 => '1227_1.jpg',
2 => '2200_1.jpg',
3 => '2200_2.jpg',
4 => '2200_2.jpg',
5 => '2201_1.png',
6 => '2203_1.jpg',
)
您可以在一次preg_replace()
来电中使用两种模式和替换进行操作,或者您可以使用preg_replace()
然后使用str_replace()
来清除悬挂的下划线。这将归结为个人编码偏好。 (也可以使用preg_replace_callback()
来检查在添加下划线之前图像名称中是否有index
个数字,但这会产生更复杂的代码段。)
代码:
$images=['1227.jpg','1227_1.jpg','2200 WH-1.jpg','2200WH 2.jpg','2200 WH2.jpg','2201_BK 1.png','2203 RD_1.jpg','2200 WH.jpg','3000_01.jpg'];
foreach($images as $image){
echo str_replace('_.','.',preg_replace('/^\d+\K[-a-z_ ]+0*/i','_',$image)),"\n";
}
或者
$images=['1227.jpg','1227_1.jpg','2200 WH-1.jpg','2200WH 2.jpg','2200 WH2.jpg','2201_BK 1.png','2203 RD_1.jpg','2200 WH.jpg','3000_01.jpg'];
foreach($images as $image){
echo preg_replace(['~^\d+\K[-a-z_ ]+0*~i','~_\.~'],['_','.'],$image),"\n";
}
答案 1 :(得分:1)
我会用以下模式来做:
SecAccessRef
替换(\d{4})([^0-9.]*)(\d\.)
。
一步一步:
$1_$3
- 检查前4位数字。(\d{4})
- 检查ID之后的所有数字或句点。([^0-9.]*)
- 检查分机前的结束号码和期间(这样我们可以正确放置下划线)添加替换意味着将4位数字添加到开头,将删除所有非数字(或句点)字符,并在(\d\.)
和剩下的任何内容之间添加下划线。如果ID之后没有任何内容,则不会添加下划线,那么也会在替换中添加句点。
您可以在Regex101上查看此内容,详细了解正在发生的事情。
在PHP中,这将是:
$1
输出:
答案 2 :(得分:1)
不是PHP的人,但我会使用的正则表达式是:
/(\d+).*?(\d?)\.(.*)/
这将捕获第一组数字,跳过中间部分,捕获末尾的数字(如果存在),然后捕获文件扩展名。
然后在ruby中我会做以下事情:
id, index, extension = my_file_name.match(/(\d+).*?(\d?)\.(.*)/)
new_name = id.to_s
new_name += "_#{index}" unless index.empty?
new_name += ".#{extension}"