首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PERL-5正则表达式奇怪地处理撇号

PERL-5正则表达式奇怪地处理撇号
EN

Stack Overflow用户
提问于 2013-10-29 17:28:28
回答 3查看 224关注 0票数 1

因此,我正在运行一组相当大的文件,并通过大容量重命名实用程序重命名它们。这个东西允许通过使用PERL-5的正则表达式重命名(或者至少它是这么说的),我有一堆文件,这些文件目前都是id - song名称艺术家的格式,并且需要交换歌曲名和艺术家。

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

代码语言:javascript
复制
(.*) - (.*) - (.*)

然后用以下名称重命名:

代码语言:javascript
复制
\1 - \3 - \2

问题是,由于一些未知的原因,它无法匹配或正确地重新组织一些文件,其中包括撇号的名字,我不知道为什么。

示例:

CBE4 4-08-03- My Lovin‘(你永远不会得到它)- En Vogue.zip <-失败匹配

CBE4 4-08-15-冈斯塔天堂- Coolio.zip <-匹配和适当改变

CBE5 5-22-11-小白鸭-儿童的Favorites.zip <-匹配,更改为"-儿童-小白鸭“

真正令人恼怒的是,有很多时候,程序的重命名文件用“儿童”这个词很好,但似乎被其他人绊倒了。

我知道这不是一个完全的编程问题,这可能只是我正在使用的程序在搞砸了一些事情,我只是好奇是否真的有什么原因让我错过了,如果有什么东西是很好的,知道将来的使用。谢谢你提供任何信息。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-29 19:19:32

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

我猜你在Windows上,我想这意味着文件名存储在UTF-16中。它使用的大容量重命名实用程序PCRE文库似乎都不能正确地处理8位范围以外的字符。

我不知道它为什么会失败(.*应该匹配任何字符序列,不管它们是如何表示的),但是有些地方出了问题。

票数 2
EN

Stack Overflow用户

发布于 2013-10-29 18:55:38

perl测试程序

代码语言:javascript
复制
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);
}

这没有显示出所报告的行为。我的命令版本

代码语言:javascript
复制
rename 's/(.*) - (.*) - (.*)/\1 - \3 - \2/' *.zip

也很好

希望这能有所帮助

票数 1
EN

Stack Overflow用户

发布于 2013-10-29 18:56:27

尝试一些不同的东西。

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

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

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

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

在任何情况下,不要只是一个自由的空间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19665196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档