正则表达式,其中*匹配除反斜杠和新行之外的所有字符

时间:2013-02-18 13:19:25

标签: c# regex git gitignore

以下是我正在尝试实施的内容

链接到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;
}

1 个答案:

答案 0 :(得分:1)

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

这就是一切都在爆炸的地方;由于\也是Regex的特殊字符,我们遇到问题,Regex并不真正知道如何处理@"[^\]*"

长话短说:正确答案是

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

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