正则表达式:重命名文件

时间:2018-02-02 21:31:09

标签: php regex

我正在尝试重命名一堆图像文件。

它们的名称不一致,但它有一些逻辑

他们都以Id number

开头

Id之后可能存在以下某些内容(要移除的项目):

  • 空格
  • 2个字母
  • 短划线-

对于空格或破折号,它们将以各种顺序出现,有时不止一次出现。

文件名可能包含任何这些项目,但不一定都包含所有项目。

某些文件名确实包含所有3个项目。

在此之后,他们可能会有额外的_

然后他们可能会有number {Index}

最后,他们以.ext ext = jpg|png|gif...

结尾

以下是一些示例文件名:

  • 1227.jpg
  • 1227_1.jpg
  • 2200 WH-1.jpg
  • 2200WH 2.jpg
  • 2200 WH2.jpg
  • 2201_BK 1.png
  • 2203 RD_1.jpg

我正在尝试删除/替换上述项目,因此文件名如下:

ID.extID_{index}.ext

所以上面的列表会变成:

  • 1227.jpg
  • 1227_1.jpg
  • 2200_1.jpg
  • 2200_2.jpg
  • 2201_1.png
  • 2203_1.jpg

我曾尝试写过一些expressions,但我对这一点感到有点困惑。

我正在开发一个PHP项目,虽然其他语言可以用于此脚本。

3 个答案:

答案 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',
)

问题扩展解决方案:(Demo)(Demo

您可以在一次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

输出:

  • 1227.jpg
  • 1227_1.jpg
  • 2200_1.jpg
  • 2200_2.jpg
  • 2200_2.jpg
  • 2201_1.png
  • 2203_1.jpg

答案 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}"