如何使用正则表达式在最后一次破折号后提取文本?

时间:2015-01-06 14:00:56

标签: java regex

我使用以下正则表达式从完整的mp3路径中提取艺术家姓名和歌曲名称:

.*\/(.*) +\- +(.*)\..*

当文件看起来像file\to\path\Artist Name - Song Title.mp3时效果很好,但是当文件名包含多个space-dash-space时,它会工作不正常,例如Artist Name - With Dash - Song Title.mp3。有没有办法用正则表达式修改来解决它?

2 个答案:

答案 0 :(得分:2)

^(?:.*\\)?(.*) +\- +(.*)\..*$

试试这个。抓住捕获。参见演示。

https://regex101.com/r/wZ0iA3/7

答案 1 :(得分:0)

将原始正则表达式中的\/更改为\\时,它实际上会提供 correct result?

但我同意nhahtdh,最终没有办法让正则表达式知道“这个破折号是否属于艺术家名称?还是歌曲名称?还是将它们分开?” < / p>

所以当你问“有没有办法解决它正则修改?”答案是

看到你标记了这个Java,并且假设你有一个已知艺术家和歌曲的数据库,一种方法可能是提取(任意数量)由-分隔的字符串然后查找匹配的艺术家名称通过连接除了最后一个之外的所有内容,如果没有找到匹配,请再次尝试少一个字符串,等等。

这是一种提取所有-分隔字符串的方法:

(?!.*[\/\\])((?:(?! - ).)+)(?: - |\.mp3)

<强> Regex101 demo