RegEx用于验证文件名

时间:2012-06-19 16:02:40

标签: c# .net regex

我有一些用特定语法命名的MP3文件,例如:

  

1 - Sebastian Ingrosso - Calling(Feat.Ryan Tedder)

我在C#中编写了一个小程序,它从ID3标签中读取Track,Artist和Title。我想做的是写一个正则表达式,可以验证文件实际上是用上面列出的语法命名的。

所以我有一个叫做歌曲的课程:

 //Properties
public string Filename
{
    get { return _filename;  }
    set { _filename = value; }
}

public string Title
{
    get { return _title;  }
    set { _title = value; }
}

public string Artist
{
    get { return _artist;  }
    set { _artist = value; }
}


//Methods

public bool Parse(string strfile)
{
    bool CheckFile;

    Tags.ID3.ID3v1 Song = new Tags.ID3.ID3v1(strfile, true);
    Filename = Song.FileName;
    Title = Song.Title;
    Artist = Song.Artist;


    //Check File Name Formatting
    string RegexBuilder = @"\d\s-\s" + Artist + @"\s-\s" + Title;
    if (Regex.IsMatch(Filename, RegexBuilder))
    {
        CheckFile = true;
    }
    else
    {
        CheckFile = false;
    }
    return CheckFile;
 }

所以它很有效,大部分时间。我在标题中有一个(壮举)它失败了。我能想出的最接近的是:

  

\ d \ s- \ s \ Artist \ s- \ s。*

这显然不会起作用,因为任何文本都会通过测试,我已经尽了最大努力,但我只编程了两周。


tl; dr 希望歌曲通过正则表达式测试是否包含特色艺术家,例如:

  

1 - Sebastian Ingrosso - Calling(Feat.Ryan Tedder)

  

1 - Flo Rida - Whistle

两者都应该通过测试。

1 个答案:

答案 0 :(得分:1)

问题是你的正则表达式中的“(”和“)”对Regex引擎有意义。您应该使用以下代码:

string RegexBuilder = @"\d\s-\s" + Regex.Escape(Artist) + @"\s-\s" + Regex.Escape(Title);

Escape功能会将“(Feat。)”更改为“\(Feat。\)”,这将确保您匹配括号而不是将“Feat”分组。

http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.escape.aspx