0

ユーザーがフォームのテキストボックス内で選択した内容に基づいて、ファイルやディレクトリのコレクションに対して (SharpSVN を使用して) SVN コマンドを実行する方法があります。

強調表示されたテキストを変数にすばやく格納し、それを確認すると、サンプル データは次のようになります。

 Modified -- C:\\\folder\\\trunk\\\SubFolderOne\\\SubFolderTwo\\\SubThree\r\nModified -- 
 C:\\\folder\\\trunk\\\SubFolderOne\\\SubFolderTwo\\\SubThree\\\myFile.cs

スペースと \r 文字の間にあるものを解析する正規表現を作成しようとしていますが、わかりません。

パターンは次のようになると思いました。

 @"\s\S*\\r"

しかし、ここでサンプルデータを使用すると、結果として次のようになります。

C:\\\folder\\\trunk\\\SubFolderOne\\\SubFolderTwo\\\SubThree\r

次に、アプリケーションの他の場所で使用される文字列のコレクションに各結果 (つまり、適切なパス/ファイル) をスローします。

うまくいけば、Path クラスを使用してこれを行うより良い方法はありますか?

私が考えることができる1つのことは、それが見つかったときはいつでも部分文字列を使用してデータを分割し、文字列から\r\n単に「プレフィックス」を削除すること(Modified --, NotVersioned --, Normal --)です。

それは本当に… 貧弱に思えます。

それが役立つ場合、最上位のディレクトリは常に C:\\folder\\trunk になることを知っています

4

2 に答える 2

2

文字列を分割して"\r\n"から、各文字列を一致させることをお勧めします。例えば:

Regex re = new Regex(@"\s(\S*?)$");
foreach (var line in s.Split(new[]{"\r\n"}, StringSplitOptions.RemoveEmptyEntries))
{
    Match m = re.Match(s);
    Console.WriteLine("{0},{1},'{2}'", m.Index, m.Length, m.Groups[1].Value);
}

サンプルテキストに対してテストすると機能します。

于 2013-10-04T20:03:22.827 に答える
1

正規表現の先読みと後読みを使用できます

String pattern = @"(?<=--\s)\S*(?=\\r|$)";
var result = Regex.Matches(input, pattern);
foreach (Match match in result)
{
    Console.WriteLine(match.Value);   
}

無効な値の解析はPathクラス向けではありません。regexまたはsplitと のいずれかを使用する必要がありsubstringます。どちらの方法も適切です。読みやすく、説明しやすく、変更しやすい方法を優先する必要があります。

var paths =
    Regex.Split(input, @"\\r\\n")
    .Select(row => row.Substring(row.LastIndexOf(' ') + 1, row.Length - row.LastIndexOf(' ') - 1));
于 2013-10-04T20:10:03.263 に答える