Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否存在内置通配符匹配?_C#_Asp.net Core - Fatal编程技术网

C# 是否存在内置通配符匹配?

C# 是否存在内置通配符匹配?,c#,asp.net-core,C#,Asp.net Core,我有一个字符串列表。我需要接受用户提供的通配符字符串列表,并返回所有匹配项(只需要支持*运算符)。我知道这可以用Regex来完成,我只是担心这太过分了,会让我面临一些潜在的恶意攻击 从我的搜索中,我发现了一些可视化的东西可以做到这一点,只是它在核心中似乎不受支持。我还发现Directory.GetFiles()只使用一个实际的文件目录而不是一个列表来执行此操作 是否有一些内置的方式来实现这一点?我只是不想担心重新发明轮子和处理安全问题 示例 files = ["foo\bar", "foo\fo

我有一个字符串列表。我需要接受用户提供的通配符字符串列表,并返回所有匹配项(只需要支持*运算符)。我知道这可以用Regex来完成,我只是担心这太过分了,会让我面临一些潜在的恶意攻击

从我的搜索中,我发现了一些可视化的东西可以做到这一点,只是它在核心中似乎不受支持。我还发现Directory.GetFiles()只使用一个实际的文件目录而不是一个列表来执行此操作

是否有一些内置的方式来实现这一点?我只是不想担心重新发明轮子和处理安全问题

示例

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
,而您不使用)。其次,只检查字符串是否包含通配符段,如果通配符仅位于开头或结尾,则这是不正确的逻辑。在这种情况下,仅当字符串以通配符开头或结尾时才应匹配。