Mega Code Archive

 
Categories / C# / Regular Expressions
 

Checks if name matches pattern with and wildcards

/*  * Filename:    FileUtil.cs  * Product:     Versioning Controlled Build  * Solution:    BuildAutoIncrement  * Project:     Shared  * Description: File utility methods.  * Copyright:   Julijan ?ribar, 2004-2007  *   * This software is provided 'as-is', without any express or implied  * warranty.  In no event will the author(s) be held liable for any damages  * arising from the use of this software.  *  * Permission is granted to anyone to use this software for any purpose,  * including commercial applications, and to alter it and redistribute it  * freely, subject to the following restrictions:  *  * 1. The origin of this software must not be misrepresented; you must not  *    claim that you wrote the original software. If you use this software  *    in a product, an acknowledgment in the product documentation would be  *    appreciated but is not required.  * 2. Altered source versions must be plainly marked as such, and must not be  *    misrepresented as being the original software.  * 3. This notice may not be removed or altered from any source distribution.  */ using System; using System.Diagnostics; using System.IO; using System.Text; using System.Text.RegularExpressions; namespace BuildAutoIncrement {     /// <summary>   /// A set of file utilities.   /// </summary>   public struct FileUtil {         /// <summary>         ///   Checks if name matches pattern with '?' and '*' wildcards.         /// </summary>         /// <param name="filename">         ///   Name to match.         /// </param>         /// <param name="pattern">         ///   Pattern to match to.         /// </param>         /// <returns>         ///   <c>true</c> if name matches pattern, otherwise <c>false</c>.         /// </returns>         public static bool FilenameMatchesPattern(string filename, string pattern) {             // prepare the pattern to the form appropriate for Regex class             StringBuilder sb = new StringBuilder(pattern);             // remove superflous occurences of  "?*" and "*?"             while (sb.ToString().IndexOf("?*") != -1) {                 sb.Replace("?*", "*");             }             while (sb.ToString().IndexOf("*?") != -1) {                 sb.Replace("*?", "*");             }             // remove superflous occurences of asterisk '*'             while (sb.ToString().IndexOf("**") != -1) {                 sb.Replace("**", "*");             }             // if only asterisk '*' is left, the mask is ".*"             if (sb.ToString().Equals("*"))                 pattern = ".*";             else {                 // replace '.' with "\."                 sb.Replace(".", "\\.");                 // replaces all occurrences of '*' with ".*"                  sb.Replace("*", ".*");                 // replaces all occurrences of '?' with '.*'                  sb.Replace("?", ".");                 // add "\b" to the beginning and end of the pattern                 sb.Insert(0, "\\b");                 sb.Append("\\b");                 pattern = sb.ToString();             }             Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);             return regex.IsMatch(filename);         }   } }