0

パスと特定のセクションがある場合、そのセクションのすぐ下にあるフォルダーの名前を見つけるにはどうすればよいですか?

これを説明するのは難しいです、いくつか例を挙げましょう。「Dev/Branches」の下にあるフォルダの名前を探しているとします。以下は入力例であり、期待される結果は太字で示されています

  • C:\ Code \ Dev \Branches\最新の\bin\ abc.dll
  • C:\ Dev \ Branches \ 5.1
  • D:\ My Documents \ Branches \ 7.0 \ Source \ Tests \ test.cs

私はC#を使用しています

編集:最初のグループをキャプチャする正規表現を使用できると思いますが、正規表現/Dev/Branches/(.*?)/なしのより優れたソリューションはありますか?とにかく、その正規表現は2番目のケースでは失敗します。

4

5 に答える 5

1
// starting path
string path = @"C:\Code\Dev\Branches\Latest\bin\abc.dll";

// search path
string search = @"Dev\Branches";

// find the index of the search criteria
int idx = path.IndexOf(search);

// determine whether to exit or not
if (idx == -1 || idx + search.Length >= path.Length) return;

// get the substring AFTER the search criteria, split it and take the first item
string found = path.Substring(idx + search.Length).Split("\\".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).First();

Console.WriteLine(found);
于 2013-02-28T13:19:36.570 に答える
1

期待どおりの動作をするコードは次のとおりです。

public static string GetSubdirectoryFromPath(string path, string parentDirectory, bool ignoreCase = true)
{
    // 1. Standarize the path separators.
    string safePath = path.Replace("/", @"\");
    string safeParentDirectory = parentDirectory.Replace("/", @"\").TrimEnd('\\');

    // 2. Prepare parentDirectory to use in Regex.
    string directory = Regex.Escape(safeParentDirectory);

    // 3. Find the immediate subdirectory to parentDirectory.
    Regex match = new Regex(@"(?:|.+)" + directory + @"\\([^\\]+)(?:|.+)", ignoreCase ? RegexOptions.IgnoreCase : RegexOptions.None);

    // 4. Return the match. If not found, it returns null.
    string subDirectory = match.Match(safePath).Groups[1].ToString();
    return subDirectory == "" ? null : subDirectory;
}

テストコード:

void Test()
{
    string path1 = @"C:\Code\Dev\Branches\Latest\bin\abc.dll";
    string path2 = @"C:\Dev\Branches\5.1";
    string path3 = @"D:\My Documents\Branches\7.0\Source\test.cs";

    Console.WriteLine("Matches:");
    Console.WriteLine(GetSubdirectoryFromPath(path1, "dev/branches/") ?? "Not found");
    Console.WriteLine(GetSubdirectoryFromPath(path1, @"Dev\Branches") ?? "Not found");
    Console.WriteLine(GetSubdirectoryFromPath(path3, "D:/My Documents/Branches") ?? "Not found");
    // Incorrect parent directory.
    Console.WriteLine(GetSubdirectoryFromPath(path2, "My Documents") ?? "Not found");
    // Case sensitive checks.
    Console.WriteLine(GetSubdirectoryFromPath(path3, @"My Documents\Branches", false) ?? "Not found");
    Console.WriteLine(GetSubdirectoryFromPath(path3, @"my Documents\Branches", false) ?? "Not found");

    // Output:
    //
    // Matches:
    // Latest
    // Latest
    // 7.0
    // Not found
    // 7.0
    // Not found
}
于 2013-02-28T13:28:11.817 に答える
0

それを小さなステップに分割すると、これを自分で解決できます。

  1. (オプション、追加の要件に応じて):ディレクトリ名を取得します(ファイルは無関係です):Path.GetDirectoryName(string)
  2. 親ディレクトリを取得しDirectory.GetParent(string)ます。

これは次のようになります。

 var directory = Path.GetDirectoryName(input);
 var parentDirectory = Directory.GetParent(directory);

提供されたC:\Dev\Branches\5.1->5.1は、指定、つまり入力パス自体のディレクトリ名に準拠していません。これにより、が出力されますBranches

于 2013-02-28T12:49:29.993 に答える
0
new Regex("\\?" + PathToMatchEscaped + "\\(\w+)\\?").Match()...
于 2013-02-28T12:50:17.780 に答える
0

私はこれで行きました

public static string GetBranchName(string path, string prefix)
{
    string folder = Path.GetDirectoryName(path);

    // Walk up the path until it ends with Dev\Branches
    while (!String.IsNullOrEmpty(folder) && folder.Contains(prefix))
    {
        string parent = Path.GetDirectoryName(folder);
        if (parent != null && parent.EndsWith(prefix))
            return Path.GetFileName(folder);

        folder = parent;
    }

    return null;
}
于 2013-03-06T11:24:06.117 に答える