是否有任何流行和/或有效的递归查找和替换算法?

时间:2016-06-20 14:48:32

标签: string algorithm recursion

我目前正在开发一个应用程序,需要从各种变体重命名音乐文件,例如

艺术家 - 以艺术家等为主题的专长

或者

艺术家 - 以艺术家等为特色的标题

艺术家 - 标题(专长。以艺术家等为特色

艺术家 - 标题(ft。特色艺术家等)

我想你明白了。

我目前的hacky方式:

private void FindAndReplace()
    {
        try
        {
            var replaceList = new Dictionary<string, string>
            {
                {"[", "("},
                {"]", ")"},
                {"(Official Audio)", ""},
                {"(Audio)", ""},
                {"OFFICIAL", ""},
                {"Official", ""},
                {"(Video)", ""},
                {"Video)", ""},
                {"(video)", ""},
                {"video)", ""},
                {"(Lyric","" },
                { " Featuring ", " (ft. "},
                {",)", ")"},
                {" FEAT ", " (FEAT "},
                {" Feat ", " (FEAT "},
                {" Feat. ", " (FEAT "},
                {"(Feat.", "(ft."},
                {"(FEAT", "(feat"},
                {"( Music",""},
                {"(feat", "(ft"},
                {"FEAT ", "ft"},
                {"( )", ""},
                {"()", ""},
                {"(|", ""},
                {"( |", ""},
                {"(  )", ""},
                {"FT ", "ft. "},
                {"Ft ", "ft. "},
                {"(Explicit)", ""},
                {"ft ", "ft. "},
                {" Ft. ", " (ft. "},//[ FT. ,  (ft. ]
                {" FT. ", " (ft. "},//[ FT. ,  (ft. ]
                {" FT", " (ft"},//[ FT,  (ft]
                {"(FT ", "(ft. "},
                {" (ft ", " (ft."},
                {" (Ft ", "(ft. "}
            };

            while (true)
            {
                var reiterate = false;
                foreach (var vari in replaceList)
                {
                    if (FileName.ToLower().Contains(vari.Key.ToLower()))
                    {
                        reiterate = true;
                    }
                }
                if (reiterate)
                    foreach (var replaceItem in replaceList.Where(replaceItem => FileName.ToLower().Contains(replaceItem.Key.ToLower()))
                        )
                    {
                        if (FileName.Contains(replaceItem.Key))
                            FileName = FileName.Replace(replaceItem.Key, replaceItem.Value);
                        else
                            FileName = FileName.Replace(replaceItem.Key.ToLower(), replaceItem.Value);

                    }
                if (reiterate) continue;
                break;
            }
        }
        catch (Exception ex)
        {

        }
    }

请注意,文件名中有许多内容需要修复。 我偶尔会遇到这种方法的错误,它们都源于替换词典的排序。是否有一些更有效和更清洁的方法来实现我的目标?

1 个答案:

答案 0 :(得分:1)

您可以使用正则表达式合并规则。

e.g

replaceAll("(?i)[\\s\\(]*fe?a?t\\.?[\\s]", " (ft. ")

有了这个,您可以围绕'功能'部分替换所有/大部分规则。