【发布时间】:2012-05-11 20:14:06
【问题描述】:
我想知道是否可以修改使用* 和? 的通配符表达式将其转换为正则表达式以验证它是否匹配某些字符串。
换句话说,如果我在这些字符串上使用过滤器(不区分大小写):*bl?e*:
["Blue", "Black", "Red", "Light blue", "Light black"]
我想得到:
["Blue, "Light blue"].
有人知道如何用正则表达式做到这一点吗? 除了使用正则表达式之外,还有更好的方法吗?
添加以更好地阐明我的想法...
好的! ...与往常一样,我以为我问了一个非常明确的问题,并通过答案意识到我完全搞砸了我的问题。我想做一个函数,它会根据与 dos ('*' '?') 相同的规则的表达式(作为我的函数的参数)过滤集合。我认为使用正则表达式是个好主意。我是对的吗,正则表达式是什么?另外...我正在使用 C#,我想知道我是否无法访问任何可以直接完成这项工作的东西?
我也在看(很好的答案)How do I specify a wildcard (for ANY character) in a c# regex statement?
我终于在 .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));
}
// ******************************************************************
}
}
【问题讨论】:
-
与
*和?匹配的模式类型称为glob(Wikipedia)。您使用的语言可能已经提供了应用此方法的方法。 -
在什么环境下?不是真的在DOS中?顺便说一句,您将 DOS 与 cmd.exe/command.com 和其他具有相同语法的 Shell 混淆了。 DOS 是一个操作系统。
-
非常感谢菲利克斯!是您的评论让我找到了最佳解决方案! ==> .net 全局类