0

我有一种方法可以根据用户在表单的文本框中选择的内容对文件和/或目录的集合执行一些 SVN 命令(使用 SharpSVN)。

快速将一些突出显示的文本存储在变量中并查看它,示例数据可能是这样的:

 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 类来做到这一点吗?

我能想到的一件事是在找到的任何时候使用子字符串拆分数据,然后简单地从字符串中\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类。您应该使用regexorsplitsubstring。两种方式都很好,您应该更喜欢一种易于阅读、解释和更改的方式。

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 回答