This is no simple task, since basically you want measure the similarity/proximity of different file names. My layman approach would be to extract the title from the file name, normalize it, and then use the shortest left-based match for comparing them. Something like this might work:
Set fso = CreateObject("Scripting.FileSystemObject")
Set re = New RegExp
re.Pattern = "^\d+(-\d+)?\s+"
Set rs = CreateObject("ADOR.Recordset")
rs.Fields.Append "NormalizedName", 200, 255
rs.Fields.Append "Length", 3
rs.Fields.Append "Path", 200, 255
rs.Open
' Store the full paths of the files and their associated normalized name in
' a disconnected recordset. The "Length" field is used for sorting (see below).
For Each f In fso.GetFolder("C:\some\folder").Files
normalizedName = LCase(re.Replace(fso.GetBaseName(f.Name), ""))
rs.AddNew
rs("NormalizedName").Value = normalizedName
rs("Length").Value = Len(normalizedName)
rs("Path").Value = f.Path
rs.Update
Next
' sort to ensure that the shortest normalized name always comes first
rs.Sort = "NormalizedName, Length ASC"
ref = ""
Set keeplist = CreateObject("Scripting.Dictionary")
rs.MoveFirst
Do Until rs.EOF
path = rs("Path").Value
name = rs("NormalizedName").Value
currentExtension = LCase(fso.GetExtensionName(path))
If ref <> "" And ref = Left(name, Len(ref)) Then
' same title as last file, so check if this one is a better match
If extension <> "mp3" And currentExtension = "mp3" Then
' always pick MP3 version if it exists
keeplist(ref) = path
extension = currentExtension
ElseIf extension = currentExtension _
And IsNumeric(Left(fso.GetBaseName(keeplist(ref)), 1)) _
And Not IsNumeric(Left(fso.GetBaseName(path), 1)) Then
' prefer file names not starting with a number when they have the
' same extension
keeplist(ref) = path
End If
Else
' first file or different reference name
ref = name
extension = currentExtension
keeplist.Add ref, path
End If
rs.MoveNext
Loop
rs.Close
For Each ref In keeplist
WScript.Echo keeplist(ref)
Next
I'm pretty sure that there are edge cases not covered by the above code, so handle with care. Also note that the code processes only a single folder. For processing a folder tree additional code is required (see here for instance).