拆分包含2个或3个组件的文件名

时间:2014-03-02 19:35:44

标签: regex split

我需要从文件名中提取艺术家,标题和评论组件, 下面是艺术家的例子 - 标题,艺术家 - 标题(评论)

ADNY - Omnipotent.flac
Community Recordings - Magic Circle (Drums In Space Mix).flac

此正则表达式仅匹配数字2,而不是数字1

(^.*)\s-\s(.*)\s(\(.*\))

Community Recordings
Magic Circle
(Drums In Space Mix)

如果我追加?在它的最后,两者都匹配,但对于数字2,评论是标题的一部分:

(^.*)\s-\s(.*)\s(\(.*\))?

ADNY
Omnipotent.flac

Community Recordings
Magic Circle (Drums In Space Mix).flac

如何拆分文件名可能有注释的组件?

(得到这样的东西)

ADNY
Omnipotent.flac

Community Recordings
Magic Circle
(Drums In Space Mix).flac

(使用.NET正则表达式)

2 个答案:

答案 0 :(得分:1)

如果我了解您的组件,请尝试下面的正则表达式。既然你提到你正在使用.NET风格,我选择使用Name'd捕获组:

^(?<Artist>.*?)\s*-\s*(?<Title>.*?(?=\s+\(|\.))(?:\s*\((?<Description>[^)]+))?

我还选择省略描述中的括号以及文件扩展名;虽然如果你想要它们可以包括它们

这是另一个包含文件类型的正则表达式:

^(?<Artist>.*?)\s*-\s*(?<Title>.*?(?=\s+\(|\.))(?:\s*\((?<Description>[^)]+)\))?\.(?<FileType>\S+)

如果要包括括号和/或“点”,只需将它们移动到捕获组中

答案 1 :(得分:0)

您还需要使尾随空格可选:

(^.*)\s-\s(.*)\s(\(.*\))?
              ^^---

如果一首歌有评论,那么就有一个空格:

Foo - Bar (Baz).flac
         ^--- space

然后在哪里没有评论,没有空间:

Foo - Bar.flac
         ^--no space

您的正则表达式要求空间存在,因此它永远不会与无评论版本匹配。尝试

(^.*)\s-\s(.*)(\s\(.*\))?
              ^^^--- swap positions

代替。