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();
}

那是对的吗?

4

4 回答 4

1

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

删除匹配到结束 anchor 的正则表达式部分$,并更改对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);
}
于 2013-02-20T14:37:15.953 回答
1

您现有的正则表达式:

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

匹配OU=,然后是一些字母和反斜杠 ( [a-zA-Z\\]+),然后是逗号,然后是任何字符 ( .*) 到行尾 ( $)。

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

通过删除,.*$最后的 修改您的正则表达式,它将匹配每个 OU 组:

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

另请注意,括号是一个捕获组。如果您还想单独捕获价值部分,它们很有用,但如果您不使用它,它们就不是必需的,您可以这样做:

@"OU=[a-zA-Z\\]+"
于 2013-02-20T14:30:51.937 回答
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"));
}
于 2013-02-20T14:34:46.383 回答
0

Group[0]返回完整匹配: Group[1]返回匹配中的第一个 Pattern [即第一个括号 '(' ')' 中的所有内容]

因此,如果您想准确获得 OU.. 的这 2 次出现,您可以这样做:

 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 [即第二个括号中的所有内容 '( '')']

给予:商店公司

但是我假设您不想对您感兴趣的每个模式的正则表达式如此明确。如果您想获得多个匹配项,那么您需要执行返回匹配集合的正则表达式匹配调用。

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

但是,这仍然不适用于您当前的正则表达式,因为从STOREso 到行尾的所有内容都将在第一场比赛中。如果您只想在“OU =”之后获得模式“1-or-more-letters”

你只需要:

@"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 "(" ")"
}
于 2013-02-20T15:07:40.320 回答