JavaScript,Regex - `.replace`只删除最后匹配的部分(当多个匹配时)

时间:2016-09-10 00:33:46

标签: javascript regex

我正在修改音乐播放器,以便在短划线或打开括号后不会在歌曲的标题中显示任何内容。

预期结果:

Bennie And The Jets - Remastered 2014

// Becomes 

Bennie And The Jets

----

The 59th Street Bridge Song (Feelin' Groovy)

// Becomes 

The 59th Street Bridge Song

----

December, 1963 (Oh What A Night!) - 2007 Remastered Version

// Becomes 

December, 1963

----

Ave Verum

// Becomes (remains...)   

Ave Verum

我用来进行修改的代码:

var song = 'some song name';

var title = function() {
    var str = song;

    var re = /(.*)(\s+((-|\()[^-\(]*))/g;

    str = str.replace(re, '$1');

    return str;
};

返回:

Bennie And The Jets

----

The 59th Street Bridge Song

----

December, 1963 (Oh What A Night!)

----

Ave Verum

第三种情况 - 两者连字符或圆括号 - 都不足。

如何强制它采取最远的匹配(以及随后的所有内容)?

另外(编辑#1)

播放器不会在连字符的连字符之前插入空格,因此连字符前面的条件是

\s+ //One or more

最终解决方案和使用(编辑#2)

(溶液)

Andy Ray提供,最终的正则表达式是:

var re2 = /\s*[(-].*$/;

(使用 - 对于尾随歌曲修饰符具有相同厌恶感的人)

违规音乐播放器为Spotify Player(对于Mac,但 对其他平台的工作方式相同)。您可以进行此类更改,因为该应用程序会被写为Chrome Embedded Framework (CEF)

CEF基本上是一个网站 - HTML,CSS和(最重要的)JavaScript。因为如果这样,你可以玩一下,尝试一下,定制他们赢得的东西,通常让你自定义。

注意!!

以下流程和代码不会在您进行更改的设备上的应用内部以外的任何地方更改您的歌曲标题。每次打开服务器时,都会从服务器中提取所有帐户详细信息。

在Mac上,感兴趣的文件可在以下位置找到:

/Applications/Spotify.app/Contents/Resources/Apps

你会在哪里找到一堆扩展名为.spa的文件。这些实际上并不是文件,而是包含相关内容的压缩目录。

我使用The Unarchiver

解压缩它们
// In terminal
cd /Applications/Spotify.app/Contents/Resources/Apps
find ./ -name \*.spa -exec unar {} \; // Or just the couple you need
find ./ -name \*.spa -exec rm {} \; // Be careful!

Spotify应用程序将完全相同,无论您是否拥有压缩或解压缩的目录。

要修改歌曲标题(特别是在"歌曲"和"播放列表"视图中),您需要查看:

collection-songs/bundle.js
playlist-desktop/bundle.js

在这两个文件中,有{strong> *只有一个对track.name的引用。快速查找将带您到达您需要的位置。这些行是你的罪犯。

在两个文件中,更改行:

name: track.name, 

要:

name: function() {
        var re1 = new RegExp('^' + '\\(.*\\).*', 'i')
        var re1_2 = /(\((.*)\))/
        var re2 = /\s*[(-].*$/g;

        var str = track.name;

        if(re1.test(str)) {
            str = str.replace(re1_2, '$2');
        }

        str = str.replace(re2, '');

        return str;
    }, 

就是这样,一切都完成了。

你从

开始

Spotify Before

然后出来

Spotify After

注意!!

我上面提到的问题只涉及:

var re2 = /\s*[(-].*$/g;

之前两个正则表达式(re1re1_2)的原因是因为有些歌曲(少数!)具有前导括号:

(Everything I Do) I Do It For You

这两个表达式以及

if(re1.test(str)) {
    str = str.replace(re1_2, '$2');
}

使其看起来像

Everything I Do I Do It For You

如果这不是一个问题,你可以把它们拿走。

这个小小的黑客在代码中可能并不漂亮,但在应用程序中确定很好看。

2 个答案:

答案 0 :(得分:2)

我认为你的问题有更简单的解决方案。

为什么不在字符串的末尾替换任何东西,从破折号或开放的paren开始,什么都没有?

str.replace( /\s*[(-].*$/, '' );

说明:

\s* Any whitespace found before a paren or a -
[(-] either of the two characters "(" or "-"
.*$ everything else up to the end of the string

此外,您可以通过简单的.substr().indexOf检查这些字符来执行此操作。

答案 1 :(得分:0)

.* greedy ,这意味着它将尽可能地匹配模式匹配的其余部分。因此,它会匹配输入中最后-(的所有内容。

使用.*?使其变得非贪婪,因此它会匹配最小的金额。

var re2 = /(.*?)(\s+((-|\()[^-\(]*))/g;