【发布时间】:2015-11-24 03:22:45
【问题描述】:
我正在尝试构建一个灵活的正则表达式来挑选媒体文件的艺术家姓名和歌曲标题。我希望它灵活并支持以下所有内容:
01 Example Artist - Example Song.mp3
01 示例歌曲.mp3 (在此示例中,没有艺术家,因此该组应为空)
示例艺术家 - 示例 Song.mp3
示例歌曲.mp3 (同样,没有艺术家)
我想出了以下内容(在 .NET 语法中,特别是对于命名的捕获组):
\d{0,2}\s*(?<artist>[^-]*)?[\s-]*(?<songname>.*)(\.mp3|\.m4a)
这很好用,但是对于这个输入失败: 01 示例歌曲.mp3
它吞下了作为艺术家的歌名,我相信是因为贪心匹配。所以,我尝试修改表达式,让艺术家部分是惰性匹配:
\d{0,2}\s*(?<artist>[^-]*)*?[\s-]*(?<songname>.*)(\.mp3|\.m4a)
变化是:
(?<artist>[^-]*)?
成为
(?<artist>[^-]*)*?
这确实解决了上述问题。但是现在,这个输入失败了:
01 Example Artist - Example Song.mp3
现在,它太懒了,它将“Example Artist - Example Song”捕获为歌曲名,而没有捕获任何艺术家名。
有人对此有什么建议吗?
【问题讨论】:
标签: .net regex regex-greedy