2012-12-17 76 views
1

我知道这可能听起来有点混乱,所以我很乐意重新命名标题。正则表达式匹配所有的字符后,另一个正则表达式匹配

基本上我有字符串,如C:... \ Downloads \ Folder \ SubFolder \ SubSubFolder。我只想返回SubFolder和SubSubFolder。

到目前为止,我的正则表达式看起来像(?=\\Downloads\\.*?\\).*,它匹配Downloads\Folder\SubFolder\SubSubFolder

有没有人有任何想法我失踪?

下面的所有解决方案似乎工作(除非你不知道“文件夹”)。可能与我用来测试正则表达式的工具有关。

回答

2

你缺少一个<。你想要一个后视((?<=...)),但你有一个前瞻((?=...))。

换句话说,您需要(?<=\\Downloads\\.*?\\).*

+0

你是对的,我正在使用错误的正则表达式操作符! GSkinner告诉我(?<..)是积极的前瞻。我没有在我的web应用程序中测试过这个,但是在GSkinner中尝试过,并且它没有工作。我们的解决方案接近于此,但我们使用了一些逻辑来确定“Folder”将会被替换。接着就,随即。测试在http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx和这个工作 –

+0

这个标记为接受的答案,因为它是最接近我原来的职位: P –

1

这不是正则表达式,但这是我该怎么做。

string marker = @"\Downloads\Folder\"; 
int i = path.IndexOf(marker); 
if (i >= 0) 
    return path.Substring(i + marker.Length); 
+0

返回文件夹,我真的只是想子文件夹,SubSubFolder –

+0

@AnthonyWood:嗯,我提供了一个途径。我已经更新了代码以执行您想要的操作,但名称文件夹是否会更改并不十分清楚。 (顺便说一句,我弟弟的名字是安东尼·伍德。) –

+0

大声笑,那是有点巧合的。但它仍然不起作用,因为文件夹是可变长度的字符串。感谢您的帮助,但我们得到了这个工作,因为我们知道你会在那里 –

1

以下正则表达式将在正则表达式匹配中返回两个命名组(sub,subub)。

(?<=\\Downloads\\[^\\]+\\)(?<sub>[^\\]+)\\(?<subsub>[^\\]+) 

检索组:

var regex = new Regex(@"(?<=\\Downloads\\[^\\]+\\)(?<sub>[^\\]+)\\(?<subsub>[^\\]+)"); 
var match = regex.Match(@"C:\..."); 
var sub = match.Groups["sub"].Value; 
var subsub = match.Groups["subsub"].Value; 
+0

这传递没有工作,我做我的GSkinner/RegExr测试。这与.NET Regex引擎不同。 –

+0

相关捐资在derekslager.com/blog/posts/2007/09/...和这个工作 –

2

您需要的字符串和非反斜杠序列的末尾匹配:

/([^\\]+)\\([^\\]+)$/ 
+0

你测试吗?我使用gskinner.com/RegExr,它不会匹配 –

+0

相关捐资在derekslager.com/blog/posts/2007/09/...和这个工作。感谢您的帮助 –