C# 从半随机文本解析文件或目录

C# 从半随机文本解析文件或目录,c#,regex,.net-3.5,C#,Regex,.net 3.5,我有一个方法,根据用户在表单文本框中选择的内容,对文件和/或目录集合执行一些SVN命令(使用SharpSVN) 快速将一些突出显示的文本存储在变量中并查看它,示例数据可能如下所示: Modified -- C:\\\folder\\\trunk\\\SubFolderOne\\\SubFolderTwo\\\SubThree\r\nModified -- C:\\\folder\\\trunk\\\SubFolderOne\\\SubFolderTwo\\\SubThree\\\myFil

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

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

 Modified -- C:\\\folder\\\trunk\\\SubFolderOne\\\SubFolderTwo\\\SubThree\r\nModified -- 
 C:\\\folder\\\trunk\\\SubFolderOne\\\SubFolderTwo\\\SubThree\\\myFile.cs
 @"\s\S*\\r"
试图编写正则表达式来解析空格和\r字符之间的任何内容,但我无法理解

我认为模式应该是这样的:

 Modified -- C:\\\folder\\\trunk\\\SubFolderOne\\\SubFolderTwo\\\SubThree\r\nModified -- 
 C:\\\folder\\\trunk\\\SubFolderOne\\\SubFolderTwo\\\SubThree\\\myFile.cs
 @"\s\S*\\r"
但使用我这里的样本数据,结果是:

C:\\\folder\\\trunk\\\SubFolderOne\\\SubFolderTwo\\\SubThree\r
然后,我将把每个结果(即正确的路径/文件)放入字符串集合中,这些字符串将在应用程序的其他地方使用

希望有更好的方法使用Path类来实现这一点吗

我能想到的一件事是,在找到
\r\n
时使用子字符串分割数据,然后简单地从字符串中删除“前缀”
(已修改--、未版本--、正常--)

看起来真的。。。虽然很穷


如果有帮助,我知道最上面的目录总是C:\\folder\\trunk

我建议您在
“\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);
}

在对示例文本进行测试时,这是有效的。

我建议您在
“\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);
}
在对示例文本进行测试时,该选项有效。

您可以使用

你可以用



你的意思是,你不想在结果中得到
\r
?你真的需要正则表达式来“解析出空格和字符之间的任何东西吗?”。简单的字符串操作还不够吗?杰瑞:我想这是个玩笑吧P L.B:我想我可能可以反复使用子字符串来查找第二个空间的索引,德米特里:谢谢!这是可行的:)也许你应该使用SharpSVN。@user1189566不,这不是开玩笑,我会建议前瞻(见Dmitry的答案)这样做。好的,我会简单地使用
@“\S*(?=\\r |$)”
(前面的空格实际上是不必要的,也会在结果中放入额外的空格,并且不需要查找)你的意思是,你不想在结果中得到
\r
?你真的需要正则表达式来“解析出空格和\r字符之间的任何内容吗?”。简单的字符串操作还不够吗?杰瑞:我想这是个玩笑吧P L.B:我想我可能可以反复使用子字符串来查找第二个空间的索引,德米特里:谢谢!这是可行的:)也许你应该使用SharpSVN。@user1189566不,这不是开玩笑,我会建议前瞻(见Dmitry的答案)这样做。好的,我会简单地使用
@“\S*(?=\\r |$)”
(前面的空格实际上是不必要的,也会在结果中添加额外的空格,并且不需要查找)好的,但问题是正则表达式没有正确解析。首先,它在文本的前半部分的返回字符中出现了“r”,然后它完全忽略了后半部分的myFile.cs。@user1189566:我将代码更新为非贪婪代码。这样效果更好吗?如果仍然不起作用,请提供一个例子。@JimMschel使用您的代码和提供的regex-Dmitry进行了尝试。不幸的是,两者都不起作用,您的正则表达式没有向匹配集合添加任何内容,Dmitry向其中添加了1个空字符串:(@user1189566我们的代码可以工作,但您给我们的输入数据错误。我使用
string input=@“Modified--C:\\\\…”;
在此上下文中
\r\n
只是符号,但如果我不使用
@
,则
\r\n
将是新的行符号,应该以不同的方式对待它。@DmitryDovgopoly很好,它现在似乎工作得更好了,谢谢你们两位。不幸的是,尽管它似乎只是在我的收藏中添加了相同的字符串foreach的迭代。与我的代码和他发布的唯一区别是,我没有写入控制台,而是得到了:files.Add(match.Groups[1].Value);没错,但问题是正则表达式没有正确解析。首先,它出现了“r”从文本前半部分的返回字符开始,它完全忽略了后半部分的myFile.cs。@user1189566:我将代码更新为非贪婪。这样做是否更好?如果仍然不起作用,请提供一个示例。@JimMschel使用您的代码和提供的regex Dmitry尝试了它。不幸的是,这两种方法都不起作用rked,您的正则表达式没有向匹配集合添加任何内容,Dmitry向其中添加了1个空字符串:(@user1189566我们的代码正常工作,但您给了我们错误的输入数据。我使用
string input=@“Modified--C:\\\\…”;
在此上下文中
\r\n
只是符号,但如果我不使用
@
,则
\r\n
将是新的行符号,应该以不同的方式对待它。@DmitryDovgopoly很好,它现在似乎工作得更好了,谢谢你们两位。不幸的是,尽管它似乎只是在我的收藏中添加了相同的字符串foreach的迭代。和我的代码和他发布的唯一区别是,我没有向控制台写入,而是得到了:files.Add(match.Groups[1].Value);