0

これが私が実装しようとしているものです

gitignoreのドキュメントへのリンク:gitignoreのマンページ

それ以外の場合、gitはパターンをFNM_PATHNAMEフラグを指定したfnmatch(3)による消費に適したシェルグロブとして扱います。パターン内のワイルドカードはパス名内の/と一致しません。たとえば、「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 に答える