【发布时间】:2013-02-18 13:19:24
【问题描述】:
这就是我要实现的目标
gitignore 文档链接:gitignore manpage
否则,git 将模式视为适合 fnmatch(3) 使用的 shell glob,带有 FNM_PATHNAME 标志:模式中的通配符将不匹配路径名中的 /。例如,“Documentation/.html” 匹配“Documentation/git.html”,但不匹配“Documentation/ppc/ppc.html”或“tools/perf/Documentation/perf.html”。 p>
我确实在代码中尝试过这个
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;
}
【问题讨论】:
-
您肯定确定您的输入字符串
patternEscaped包含"\\*"而不仅仅是"*"吗? -
@Nolonar 输入字符串仅包含“”,我将其替换为 > [^\](零个或多个字符,“\”除外。因为它是 windows第二个“\”用于在字符串中转义。
-
“与预期不符”。你能举一个
verbatim的例子吗? -
事情是;您的代码似乎使用
string.Replace()将@"\*"(又名"\\*")替换为"[^\\]*"。对于字符串,*是有效字符,不需要转义。请改用patternEscaped.Replace("*", "[^\\]*")。 -
@Nolonar pattern: folder*\folder111 string: folder11\folder111\somefile.txt 这仍然给我错误且不匹配,我确实将“\*”更改为“*”