我想知道是否可以修改使用的通配符表达式*
并将?
其转换为正则表达式以验证它是否与某些字符串匹配。
换句话说,如果我*bl?e*
在这些字符串上使用过滤器(不区分大小写):
["Blue", "Black", "Red", "Light blue", "Light black"]
我想得到:
["Blue, "Light blue"].
有人知道如何用正则表达式做到这一点吗?除了使用正则表达式之外,还有更好的方法吗?
添加以更好地阐明我的想法...
行!...与往常一样,我以为我提出了一个非常明确的问题,并通过答案意识到我完全搞砸了我的问题。我想做一个函数,它会根据与 dos ('*' '?') 相同的规则的表达式(作为我的函数的参数)过滤集合。我认为使用正则表达式是个好主意。我是对的吗,正则表达式是什么?另外......我正在使用 C#,我想知道我是否无法访问任何可以直接完成这项工作的东西?
我还看看(相当好的答案)如何在 ac# regex 语句中指定通配符(对于任何字符)?
我终于在 .net Patterns and Practices 库中使用了 Glob 类。
但作为参考,这是我将 Glob exp 转换为 RegEx 的代码:
using System.Text;
using System.Text.RegularExpressions;
namespace HQ.Util.General
{
public class RegexUtil
{
public const string RegExMetaChars = @"*?(){}[]+-^$.|\"; // Do not change the order. Algo depends on it (2 first chars should be dos like wildcard char)
// ******************************************************************
/// <summary>
/// Convert an filter expression with '*' (wildcard any char) and '?' (wildcard on char) into a valid regex and
/// strip any special regex character
/// </summary>
/// <param name="dosLikeExpressionFilter"></param>
/// <returns></returns>
public static string DosLikeExpressionFilterToRegExFilterExpression(string dosLikeExpressionFilter)
{
StringBuilder regex = new StringBuilder();
regex.Append("(?i)"); // Case insensitive
int startIndex = 0;
int count = dosLikeExpressionFilter.Length;
while (startIndex < count)
{
int metaIndex = RegExMetaChars.IndexOf(dosLikeExpressionFilter[startIndex]);
if (metaIndex >= 0)
{
if (metaIndex == 0)
{
regex.Append(".*");
}
else if (metaIndex == 1)
{
regex.Append(".");
}
else
{
regex.Append("\\");
regex.Append(dosLikeExpressionFilter[startIndex]);
}
}
else
{
regex.Append(dosLikeExpressionFilter[startIndex]);
}
startIndex++;
}
return regex.ToString();
}
// ******************************************************************
/// <summary>
/// See 'DosLikeExpressionFilterToRegExFilterExpression' description to see what type of Regex is returned
/// </summary>
/// <param name="dosLikeExpressionFilter"></param>
/// <returns></returns>
public static Regex DosLikeExpressionFilterToRegEx(string dosLikeExpressionFilter)
{
return new Regex(DosLikeExpressionFilterToRegExFilterExpression(dosLikeExpressionFilter));
}
// ******************************************************************
}
}