以下是我正在尝试实施的内容
链接到gitignore文档:gitignore manpage
否则,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;
}
答案 0 :(得分:1)
您面临的问题是"[^\\]*"
。由于\
用于描述转义字符,"\\"
解析为文字\
字符,这是Regex
将看到的唯一字符。
这就是一切都在爆炸的地方;由于\
也是Regex
的特殊字符,我们遇到问题,Regex
并不真正知道如何处理@"[^\]*"
。
长话短说:正确答案是
patternEscapedForStar = patternEscaped.Replace(@"\*", @"[^\\]*");
或
patternEscapedForStar = patternEscaped.Replace(@"\*", "[^\\\\]*");