PERL-5正则表达治疗撇号奇数

时间:2013-10-29 17:28:29

标签: regex perl

所以我正在运行一大堆文件,并通过Bulk Rename Utility重命名它们。这个东西允许通过使用PERL-5的正则表达式重命名(或者至少就是它所说的)我有一堆目前格式为[id] - [歌曲名称] - [艺术家]并且需要交换的文件歌曲名称和艺术家。

我用来从文件中获取信息的正则表达式是:

(.*) - (.*) - (.*)

然后用:

重命名
\1 - \3 - \2

问题是由于某些未知原因,它无法匹配或正确重新组织其名称中包含撇号的某些文件,我无法弄清楚原因。

示例:

CBE4-08-03 - 我的Lovin'(你永远不会得到它) - En Vogue.zip< - 无法匹配

CBE4-08-15 - Gangsta的天堂 - Coolio.zip< - 正确匹配和更改

CBE5-22-11 - 小白鸭 - 儿童的最爱.zip< - 匹配,更改为“ - 儿童 - 小白鸭.zip”

关于这一点的真正令人愤怒的部分是,有很多时候程序用“儿童”这个词重命名文件就好了,但似乎又绊倒了别人。

我知道这不是一个完全编程的问题,它可能只是我正在使用的程序弄乱了一些东西,我只是好奇是否真的有这个原因让我失踪了,如果有的话,将来会很有用。感谢您的任何信息。

3 个答案:

答案 0 :(得分:2)

这不是一个完整的答案,但你在“Gangsta's Paradise”中有一个实际的撇号字符(U+0027),而在另外两个文件名中有一个正确的单引号(U+2019)。

我认为你在Windows上,我认为,这意味着文件名存储在UTF-16中。看来它使用的Bulk Rename UtilityPCRE library无法正常使用8位范围之外的字符。

我不知道它为什么会失败(.*应匹配任何字符序列,但它们已被表示),但某些出错了。

答案 1 :(得分:1)

perl中的测试程序

use warnings;
use strict;

my @td = ( q|CBE4-08-03 - My Lovin’ (You’re Never Gonna Get It) - En Vogue.zip|,           q|CBE4-08-15 - Gangsta's Paradise - Coolio.zip|,
           q|CBE5-22-11 - Little White Duck - Children’s Favorites.zip|);

for my $r (@td) {
    $r =~s/(.*) - (.*) - (.*)/\1 - \3 - \2/;
    close($file);
}

这并未显示报告的行为。我的命令版本

rename 's/(.*) - (.*) - (.*)/\1 - \3 - \2/' *.zip

也工作正常

希望这有帮助

答案 2 :(得分:0)

尝试一些不同的东西。

^(.*)-(.*)-(.*)$

^(.+)-(.+)-(.+)$

^([\S\s]*)-([\S\s]*)-([\S\s]*)$

^([\S\s]+)-([\S\s]+)-([\S\s]+)$

在所有情况下,不要只有一个自由空间。