0

这是我要实现的

链接到 gitignore 文档:gitignore 手册页

否则,git 将模式视为适合 fnmatch(3) 使用的带有 FNM_PATHNAME 标志的 shell glob:模式中的通配符将不匹配路径名中的 /。例如,“Documentation/ .html”匹配“Documentation/git.html”,但不匹配“Documentation/ppc/ppc.html”或“tools/perf/Documentation/perf.html”。

我确实在代码中尝试过

patternEscapedForStar = patternEscaped.Replace(@"\*", "[^\\]*");

上一行是改变正则表达式中 * 的行为,以匹配文件或文件夹路径中除“\”之外的所有字符。但是,它似乎与预期的不匹配。由于我使用的是 gitignore 模式,因此在上面提到的替换之前,我确实将 blob 转换为正则表达式。

顺便说一句,我涉足正则表达式,并且在任何方面都不是专家。谢谢你的帮助。

编辑:

这是完整的代码

public static bool PatternMatch(string str, string pattern, string type)
{
string patternEscaped = string.Empty;
string patternEscapedForStar = string.Empty;                                              
string patternEscapedForQuestionMark = string.Empty;
bool returnValue = false;

try
{
    patternEscaped = Regex.Escape(pattern);

    patternEscapedForStar = patternEscaped.Replace(@"\*", ".*");
    if (type == "P")
    {
        patternEscapedForStar = patternEscapedForStar.Replace(@".*", "[^\\]*");
    }

    patternEscapedForQuestionMark = patternEscapedForStar.Replace(@"\?", ".");

    returnValue = new Regex(patternEscapedForQuestionMark, RegexOptions.IgnoreCase | RegexOptions.Singleline).IsMatch(str);

 }
 catch (Exception ex)
 {
     Log.LogException(ex);
 }
    return returnValue;
}
4

1 回答 1

1

您面临的问题是因为"[^\\]*". 由于\用于描述转义字符,"\\"解析为文字字符,这是您将看到\的唯一字符。Regex

那就是一切都爆炸的地方;由于\也是 的一个特殊字符Regex,所以我们遇到了问题,那Regex真的不知道该怎么处理@"[^\]*"

长话短说:正确答案是

patternEscapedForStar = patternEscaped.Replace(@"\*", @"[^\\]*");

或者

patternEscapedForStar = patternEscaped.Replace(@"\*", "[^\\\\]*");
于 2013-02-18T14:13:56.930 回答