C# 是否存在内置通配符匹配?
我有一个字符串列表。我需要接受用户提供的通配符字符串列表,并返回所有匹配项(只需要支持*运算符)。我知道这可以用Regex来完成,我只是担心这太过分了,会让我面临一些潜在的恶意攻击 从我的搜索中,我发现了一些可视化的东西可以做到这一点,只是它在核心中似乎不受支持。我还发现Directory.GetFiles()只使用一个实际的文件目录而不是一个列表来执行此操作 是否有一些内置的方式来实现这一点?我只是不想担心重新发明轮子和处理安全问题 示例C# 是否存在内置通配符匹配?,c#,asp.net-core,C#,Asp.net Core,我有一个字符串列表。我需要接受用户提供的通配符字符串列表,并返回所有匹配项(只需要支持*运算符)。我知道这可以用Regex来完成,我只是担心这太过分了,会让我面临一些潜在的恶意攻击 从我的搜索中,我发现了一些可视化的东西可以做到这一点,只是它在核心中似乎不受支持。我还发现Directory.GetFiles()只使用一个实际的文件目录而不是一个列表来执行此操作 是否有一些内置的方式来实现这一点?我只是不想担心重新发明轮子和处理安全问题 示例 files = ["foo\bar", "foo\fo
files = ["foo\bar", "foo\foo", "bar\foo", "test"]
patterns = ["test", "foo\*"]
matches = ["foo\bar", "foo\foo", "test"]
我不需要任何特殊运算符,除了*恐怕没有内置的方法来匹配c#中的通配符 但是,您可以用类似这样的方式模拟通配符“*”匹配
// Since you only need '*' wildcard functionality, separate the wildcard
// into segments to match against the list items
public IEnumerable<string> GetWildcardSegments(string wildcard)
{
return wildcard.Split('*');
}
public List<string> FilterListWithWildcard(IEnumerable<string> list, string wildcard)
{
List<string> result = new List<string>();
foreach(string listItem in list)
{
bool matchFailed = false;
foreach(string segment in GetWildcardSegments(wildcard))
{
if(!listItem.Contains(segment))
{
matchFailed = true;
break;
}
}
if(!matchFailed)
{
result.Add(listItem);
}
}
return result;
}
//由于您只需要“*”通配符功能,请将通配符分隔开
//分为段以与列表项匹配
公共IEnumerable GetWildcardSegments(字符串通配符)
{
返回通配符.Split('*');
}
公共列表筛选器列表带通配符(IEnumerable列表,字符串通配符)
{
列表结果=新列表();
foreach(列表中的字符串listItem)
{
bool matchFailed=false;
foreach(GetWildcardSegments中的字符串段(通配符))
{
如果(!listItem.Contains(段))
{
matchFailed=true;
打破
}
}
如果(!matchFailed)
{
结果.添加(列表项);
}
}
返回结果;
}
如果您能提供一个示例,说明这些搜索字符串和目标字符串是什么样子的,那就太好了。对不起,刚才添加了一些。我认为字符串表示文件名的事实与此无关,对吗;i、 e.您的需要只是在字符串列表上进行通配符匹配?正确,我只是想提及我的动机代码-看看这个:这段代码有很多问题。首先,通过在星号上拆分,如果星号出现在开始或结束处,则列表中将以空字符串结束(除非您使用StringSplitOptions.removemptyEntries
,而您不使用)。其次,只检查字符串是否包含通配符段,如果通配符仅位于开头或结尾,则这是不正确的逻辑。在这种情况下,仅当字符串以通配符开头或结尾时才应匹配。