0

ディレクトリ パスの部分文字列が必要です。それを行うためのクエリまたは正規表現はありますか。私が持っているパスは次のようなものです:

E:\\Work\\Taxonomies\\012\\20110826\\20110826_final\\full_entry_point_2011-08-26.xsd

私が欲しいのは

20110826_final\\full_entry_point_2011-08-26.xsd

最後から2番目の「\」からのパスが必要です。配列に分割できますが、最後の2つの値を結合する必要があります。

string[] path = value.Split('\\');
int length=path.Length;
if(length>1)
{
 string final = string.Concat(path[length-2],"\\", path[length-1]);
}

これについて私を案内してください。それを実装する他の方法はありますか?

4

3 に答える 3

2
String pattern = @"(.*\\)(.*\\.*$)";
String input = @"E:\Work\Taxonomies\012\20110826\20110826_final\full_entry_point_2011-08-26.xsd";
String result = Regex.Match(input, pattern).Groups[2].Value;

編集

この正規表現は、文字列を 2 つのグループに分割します。最初 - すべての記号と \ 2 番目のグループの前にかかる可能性があります。2 番目 - 'text'\'text''endofstring' である残りのすべての記号

于 2013-03-29T12:50:56.000 に答える
0

この検索操作に正規表現を使用する別の方法は、次のように String クラスで LastIndexOf メソッドを使用することです。

    static bool TryFindTrailingPart(string path, int numberOfSeparators, out string result)
    {
        var sep = Path.DirectorySeparatorChar;
        var lastSlash = path.Length;
        for(int i = 0; i < numberOfSeparators; i++)
        {
            lastSlash = path.LastIndexOf(sep, lastSlash - 1);
            if(lastSlash < 0)
            {
                result = null;
                return false;
            }
        }

        result = path.Substring(lastSlash + 1);
        return true;
    }

このコードは正規表現よりかなり長いですが、いくつかの利点があります: 正規表現の方法よりも柔軟性があり (検索するパス セパレータの数をパラメータ化する)、実行速度が大幅に速くなります。

OP のパス式を使用して上記のコードをタイト ループで実行すると、10000 回の反復で約 200 ミリ秒かかります。

Dmitry Dovgopoly's answer に示されている正規表現アプローチを同じ反復回数に使用すると、約 6890 ミリ秒かかります。コンパイル済みの正規表現を使用するように Dmitry のコードを変換する (式のコンパイルに必要な時間を除く) には、まだ約 3140 ミリ秒かかります。

このアプローチの速度と柔軟性がソース コードの長さの増加を上回るかどうかは、特定のシナリオに大きく依存します。(非常に!) 多数のパス文字列を処理している場合は、役立つ可能性があります。一方、パス文字列処理の問題を処理するために「一度だけ使用する」コードが必要な場合は、おそらく正規表現のアプローチの方が適しています。

于 2013-03-29T14:26:49.570 に答える
0

私は C# を知らないので、おそらく "\" の数を扱うことになるでしょうが、正規表現でそれを行いたい場合は、次のようにします。

/(?<=\\\\)[^\\]+\\\\[^\\]+$/

つまり、「2 つのバックスラッシュが前にある 1 つまたは複数の文字、次に 2 つのバックスラッシュ、最後まで 1 つまたは複数の文字」です。私が文字を意味するとき、私はバックスラッシュ以外のすべてを意味します.

于 2013-03-29T12:50:36.810 に答える