1

图案:

(.*?) (?:(\d+)\:)??(?:(\d+)\:)??(\d+)

输入

song1.mp3 2:35
song2.mp3 1:2:45
song3.mp3 45

代替:

the song "$1" is $3min and $4sec

我想要的结果

the song "song1.mp3" is 2min and 35sec
the song "song2.mp3" is 2min and 45sec
the song "song3.mp3" is min and 45sec

发生的事情是微小的部分试图不发生,并且由于某种原因,.*?在空间发生之前最左边的非贪婪模式( )而不是最右边的非贪婪模式((?:(\d+)\:)??)。

这似乎是一种奇怪的行为。我在使用 flash的http://gskinner.com/RegExr/和使用 JS的http://regexpal.com/中尝试过

我可以在最后使用它来修复它$,但是如果我不想匹配结尾怎么办?.*$打破它。

我主要关心 .NET 和 JS 解决方案。

4

2 回答 2

1

试试这个模式:

(?<song>[^ ]+) (?:(?:(?<h>\d+):)?(?:(?<m>\d+):))?(?<s>\d+)
于 2013-06-19T00:24:50.673 回答
1

以下似乎适用于您的所有示例,替换匹配项:

(.*?) (\d+:)?(\d+):(\d+)

和:

the song "$1" is $3min and $4sec
于 2013-06-18T23:34:10.760 回答