2013-02-20 85 views
1

使用DirectoryServices.AccountManagement我得到用户DistinguishedName它看起来像这样:提高正则表达式搜索

CN=Adam West,OU=STORE,OU=COMPANY,DC=mycompany,DC=group,DC=eu 

我需要从这个获得第一OU值。
我发现类似的解决方案:C# Extracting a name from a string

而且使用了一些调整我创造了这个代码:

string input = @"CN=Adam West,OU=STORE,OU=COMPANY,DC=mycompany,DC=group,DC=eu"; 
Match m = Regex.Match(input, @"OU=([a-zA-Z\\]+)\,.*$"); 
Console.WriteLine(m.Groups[1].Value); 

此代码返回STORE如预期,但如果我改变Groups[1]Groups[0]我得到几乎相同的结果,输入字符串:

OU=STORE,OU=COMPANY,DC=mycompany,DC=group,DC=eu 

如何更改此正则表达式,使其仅返回OU的值?所以在这个例子中,我得到了2个匹配的数组。如果我的字符串中有更多的OU,那么数组会更长。

编辑: 我已经转换我的代码(使用@dasblinkenlight建议)进入功能:

private static List<string> GetOUs() 
{ 
    var input = @"CN=Adam West,OU=STORE,OU=COMPANY,DC=mycompany,DC=group,DC=eu"; 
    var mm = Regex.Matches(input, @"OU=([a-zA-Z\\]+)"); 
    return (from Match m in mm select m.Groups[1].Value).ToList(); 
} 

是正确的吗?

回答

1

你的正则表达式很好(几乎),你只是使用了错误的API。

删除匹配到结束锚$的正则表达式的部分,改变Match呼吁的Matches呼叫,并获得比赛的一环,这样的:

var input = @"CN=Adam West,OU=STORE,OU=COMPANY,DC=mycompany,DC=group,DC=eu"; 
var mm = Regex.Matches(input, @"OU=([a-zA-Z\\]+)"); 
foreach (Match m in mm) 
    Console.WriteLine(m.Groups[1].Value); 
} 
+0

我更新了我的问题,并将我的代码转换为函数。你可以看看吗? – Misiu 2013-02-20 14:49:06

+0

@Misiu是的,改变是正确的。你可以减少'res'变量,并返回你赋给它的表达式,就像这样:'return(from m in mm select m.Groups [1] .Value).ToList();' – dasblinkenlight 2013-02-20 14:53:57

+0

谢谢! :)是否有可能只获得'OU'simper的第一个值?现在我得到所有OU组并且必须执行'[0]',但是也许我可以更快更轻松地获得第一个OU? – Misiu 2013-02-20 15:01:48

1

您现有的正则表达式:

@"OU=([a-zA-Z\\]+)\,.*$" 

匹配OU=,然后一些字母和反斜杠([a-zA-Z\\]+),然后一个逗号,那么任何字符(.*)到线($)结束。

因此,单个匹配将始终匹配第一个OU部分之后的整行。

通过在年底卸下,.*$修改您正则表达式,它会每个OU小组赛:

@"OU=([a-zA-Z\\]+)" 

另外还要注意,括号是捕获组。他们是有用的,如果你也想自己捕捉只是价值的一部分,但如果你没有使用,他们是没有必要的,而且你可以有这样的:

@"OU=[a-zA-Z\\]+" 
+0

如果我做'Regex.Match(input,@“OU =([a-zA-Z \\] +)”);'然后选择组[0]我得到'OU = STORE'而不是'STORE' – Misiu 2013-02-20 14:34:36

0

这是怎么一回事,因为你是混合了比赛和组

string input = @"CN=Adam West,OU=STORE,OU=COMPANY,DC=mycompany,DC=group,DC=eu"; 
MatchCollection mc = Regex.Matches(input, @"OU=([a-zA-Z\\]+),"); 

foreach(Match m in mc) 
{ 
    Console.WriteLine(m.Result("$1")); 
} 
0

Group[0]返回完整匹配: Group[1]返回匹配中的第一个Pattern [ie一切都在第一个括号“(”“)”]

所以,如果你想获得准确OU的那些2个occurances ..你可以这样做:

Match m = Regex.Match(input, @"OU=([a-zA-Z\\]+)\,OU=([a-zA-Z\\]+)\,.*$"); 
Console.WriteLine(m.Groups[1].Value); 
Console.WriteLine(m.Groups[2].Value); 

Group[0]返回完整的匹配:(其你不想要) Group[1]返回匹配中的第一个Pattern [即第一个括号内的所有内容('')'] Group[2]返回匹配中的第二个Pattern [ie一切都在第二个括号“(”“)”]

,并提供: STORE 公司

但我假设你没有想得那么明确的用正则表达式的每个模式您有兴趣 如果您想获得多个匹配,那么您需要执行返回Matchcollection的Regex的Matches调用。

MatchCollection ms = Regex.Matches(...); 

这仍然不会与当前的正则表达式的工作,虽然,因为一切从STORE太行年底将在第一场比赛。如果你只是想后拿到模式“1或者更多字母” a“OU =”

你只需要:

@"OU=([a-zA-Z\\]+)" 

所以,你的代码是:

string input = @"CN=Adam West,OU=STORE,OU=COMPANY,DC=mycompany,DC=group,DC=eu"; 
MatchCollection ms = Regex.Matches(input, @"OU=([a-zA-Z\\]+)"); 

foreach (Match m in ms) 
{ 
    Console.WriteLine(m.Groups[1].Value);// get the string in the first "(" ")" 
}